Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47504
  • 博文数量: 20
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-16 15:07
文章分类

全部博文(20)

文章存档

2010年(15)

2008年(5)

我的朋友

分类: C/C++

2008-11-10 12:56:16

-----------------------------------------------------------------------------------
UNIX域无连接
-----------------------------------------------------------------------------------
服务器端程序
 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>

#define SERVER_FILE "server_socket"

main(void)
{
        int orig_sock, //服务器端原来套接字描述符


                               clnt_len, //客户端地址长度


                               i; //循环计数器



    static struct sockaddr_un clnt_adr, //客户-服务器的UNIX地址


                               serv_adr;

    static char buf[128]; //消息缓冲区


    void clean_up(int , char *); //关闭套接字并删除例程


    if((orig_sock = socket(AF_UNIX,SOCK_DGRAM,0)) < 0)
    {
          peeror("generate error");
          exit(1);
    }
    serv_adr.sun_family = AF_UNIX;
    strcpy(serv_adr.sun_path,SERVER_FLIE); //分配名字

    unlink(SERVER_FLIE);
    if(bind(orig_sock, (struct sockaddr *)&serv_adr,sizeof(serv_adr.sun_family)
       +strlen(serv_adr.sun_path)) < 0)
    {
          peeror("bind error");
          clean_up(orig_sock,SERVER_FLIE);
          exit(2);
    }
    for(i =1;i<=10;i++)
    {
          recvfrom(orig_sock,buf,sizeof(buf),0,(struct sockaddr *)&clnt_adr,&clnt_len);
          printf("%s\n\n",buf);
    }
    clean_up(orig_sock,SERVER_FLIE);
    exit(0);
}    

void clean_up(int sd,char * the_file)
{
     close(sd);
     unlink(the_file);
}

客户端代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>

#define SERVER_FILE "server_socket"

main(void)
{
    int                        orig_sock,

                               i;


    static struct sockaddr_un  clnt_adr,

                               serv_adr;

    static char                buf[128]; //消息缓冲区

    
                               client_flie[15];

    void clean_up(int , char *); //关闭套接字并删除例程

    
    serv_adr.sun_family = AF_UNIX;
    strcpy(serv_adr.sun_path,SERVER_FLIE); //分配名字


    if((orig_sock = socket(AF_UNIX,SOCK_DGRAM,0)) < 0)
    {
          peeror("generate error");
          exit(1);
    }

    sprintf(client_file,"%07d_socket",getpid());
    clnt_adr.sun_family = AF_UNIX;
    strcpy(clnt_adr.sun_path,client_file);
    
    if(bind(orig_sock, (struct sockaddr *)&clnt_adr,sizeof(clnt_adr.sun_family)
       +strlen(clnt_adr.sun_path)) < 0)
    {
          peeror("bind error");
          exit(2);
    }
    for(i =1;i<=10;i++)
    {
                sleep(1);
                sprintf(buf,"c: %d\n\n",i);
          sendto(orig_sock,buf,sizeof(buf),0,(struct sockaddr *)&serv_adr,sizeof(struct sockaddr));
    }
    clean_up(orig_sock,client_file);
    exit(0);
}    

void clean_up(int sd,char * the_file)
{
     close(sd);
     unlink(the_file);
}

 

-----------------------------------------------------------------------------------
因特网域无连接
-----------------------------------------------------------------------------------
服务器端程序
 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<netinet/in.h>

#define SERVER_FILE "server_socket"

main(void)
{

    int sock, n,
                               server_len,client_len;


    static struct sockaddr_in server, //地址结构

                           

                               client;

    static char buf[128]; //消息缓冲区


    if((sock = socket(AF_INET,SOCK_DGRAM,0)) < 0)
    {
          peeror("SERVER socket error");
          exit(1);
    }
    
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(0); //拾取一个未被占用的端口


    if(bind(sock, (struct sockaddr *)&server,sizeof(server)) < 0)
    {
          peeror("SERVER bind error");
          exit(2);
    }
    if(getsockname(sock,(struct sockaddr *)&server,&server_len)<0)

    {

          perror("SERVER getsockname error");

          exit(3);

    }

    printf("Server using port %d \n\n",ntohs(server.sin_port));

    while(1)

   {

          client_len = sizeof(client);

          memset(buf,0,128);

          if((n = recvfrom(sock,buf,128,0,(struct sockaddr *)&client ,&client_len))<0)

          {

                perror("SERVER recvfrom error");

                close(sock);

                exit(4);

          }

          write(fileno(stdout),buf,n);

          memset(buf,0,128);

          if(fgets(buf,128,stdin) != NULL)

          {

                if((sendto(sock,buf,strlen(buf),0,(struct sockaddr *)&client,client_len))<0)

                {

                      perror("SERVER sendto error");

                      close(sock);

                      exit(5);

                }

          }

     }
   
}

客户端程序

 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<netinet/in.h>

#define SERVER_FILE "server_socket"

main(int argc ,char *argv[])
{

    int sock, n,
                               server_len;

    static struct sockaddr_in server, //地址结构

                               client;

    static char buf[128]; //消息缓冲区


    struct hostent *host;
    if(argc < 3)
    {
                fprintf(stderr,"usage: %s server port_#\n",argv[0]);    
                exit(1);
    }
    if(!(host = gethostbyname(argv[1])))
    {
                perror("CLIENT gethostname error");
                exit(2);
    }
    serv_adr.sin_family = AF_INET;
    memcpy(&server.sin_addr,host->h_addr,host->h_length);
    server.sin_port = htons(atoi(argv[2])); //拾取一个未被占用的端口

    if((sock = socket(AF_INET,SOCK_DGRAM,0)) < 0)
    {
          peeror("CLIENT socket error");
          exit(3);
    }
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = htonl(INADDR_ANY);
    client.sin_port = htons(0);

    if(bind(sock, (struct sockaddr *)&client,sizeof(client)) < 0)
    {
          peeror("CLIENT bind error");
          exit(4);
    }
     

    while(fgets(buf,128,stdin) != NULL)

   {

          server_len = sizeof(server);

          if((sendto(sock,buf,strlen(buf),0,(struct sockaddr *)&server ,&server_len))<0)

          {

                perror("CLIENT sendto error");

                close(sock);

                exit(5);

          }

          memset(buf,0,128);
                    if((n = recvfrom(sock,buf,128,0,(struct sockaddr *)&server,&server_len))<0)
                    {
                                perror("CLIENT recvfrom error");
                                close(sock);
                                exit(6);
          }
                    write(fileno(stdout),buf,n);
                    memset(buf,0,128);

     }
     close(sock);
     exit(0);
   
}

阅读(1277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~