一.相关函数说明

    UDP是无连接的,即发送数据之前不需要建立连接。

    除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数。

    1.sendto函数:用于客户端中指定一目的地发送数据。

    (1)函数原型

    

    (2)参数说明

    sockfd:套接字

    buf:待发送数据的缓冲区

    len:缓冲区长度

    flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞

  dest_addr:指向目的套接字的地址

    addrlen:指向目的套接字的长度

    (3)返回值

    

    2.recvfrom函数:用于服务器端从套接口上接受数据。

    (1)函数原型

    

    (2)参数说明

    sockfd:套接字

    buf:待发送数据的缓冲区

    len:缓冲区长度

    flags:调用方式标志位,一般为0;若改变flags,则sendto发送数据的形式会变成阻塞

    dest_addr:指向源套接字的地址

    addrlen:指向源套接字的长度

    (3)返回值

    

 二.程序实现

    server端:

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 #include
  9  10 void usage(char *proc) 11 { 12         printf("%s [ip][port]\n",proc); 13 } 14  15 int main(int argc,char *argv[]) 16 { 17         if(argc!=3) 18         { 19                 usage(argv[0]); 20                 exit(1); 21         } 22         int sock=socket(AF_INET,SOCK_DGRAM,0); 23         if(sock<0) 24         { 25                 perror("socket"); 26                 exit(2); 27         } 28         int port=atoi(argv[2]); 29         char *ip=argv[1]; 30  31         struct sockaddr_in local; 32         local.sin_family=AF_INET; 33         local.sin_port=htons(port); 34         local.sin_addr.s_addr=inet_addr(ip); 35  36         if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) 37         { 38                 perror("bind"); 39                 exit(3); 40         } 41  42         char buf[1024]; 43         struct sockaddr_in remote; 44         socklen_t len=sizeof(remote); 45         while(1) 46         { 47                 memset(buf,'\0',sizeof(buf)); 48                 ssize_t _s=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockadd    r*)&remote,&len); 49                 char *client_ip=inet_ntoa(remote.sin_addr); 50                 int client_port=ntohs(remote.sin_port); 51                 if(_s<0) 52                 { 53                         perror("recvfrom"); 54                         break; 55                 } 56                 else if(_s==0) 57                 { 58                         printf("client %s close...\n",client_ip); 59                         exit(4); 60                 } 61                 else 62                 { 63                         printf("client:[ip:%s][port:%d]:%s",client_ip,client    _port,buf); 64                 } 65  66         } 67         close(sock); 68         return 0; 69 }

    client端:

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 #include
  9  10 void usage(char *proc) 11 { 12         printf("%s [ip][port]\n",proc); 13 } 14  15 int main(int argc,char *argv[]) 16 { 17         if(argc!=3) 18         { 19                 usage(argv[0]); 20                 exit(1); 21         } 22         int sock=socket(AF_INET,SOCK_DGRAM,0); 23         if(sock<0) 24         { 25                 perror("socket"); 26                 exit(2); 27         } 28         char *ip=argv[1]; 29         int port=atoi(argv[2]); 30  31         struct sockaddr_in client; 32         client.sin_family=AF_INET; 33         client.sin_port=htons(port); 34         client.sin_addr.s_addr=inet_addr(ip); 35  36         char buf[1024]; 37         while(1) 38         { 39                 memset(buf,'\0',sizeof(buf)); 40                 ssize_t _s=read(0,buf,sizeof(buf)-1); 41                 _s=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client    ,sizeof(client)); 42         } 43         return 0; 44 }

    实现结果: