现在的位置: 首页 > 综合 > 正文

linux 下UDP通信(附加测试代码)

2013年03月22日 ⁄ 综合 ⁄ 共 4632字 ⁄ 字号 评论关闭

转自csdn博客:http://blog.csdn.net/rao_warrior/article/details/8188687

运行环境:centos 6.3  

说明 :UNIX 网络编程测试代码

将客户端、服务端、以及广播消息的服务端都集成一段代码里面,个人感觉还不错呵呵呵

里面的注释不多,但是应该不难读懂的,还算比较容易

可以把一面代码直接贴下来,用gcc  编译跑一下,会发现在效果还不错吐舌头

  1. #include <stdio.h>  
  2. #include <sys/types.h>          /* See NOTES */  
  3. #include <sys/socket.h>  
  4. #include <netinet/in.h>  
  5. #include <string.h>  
  6. #include <errno.h>  
  7. #include <stdlib.h>  
  8. #include <arpa/inet.h>  
  9. #include <unistd.h>  
  10.   
  11. typedef struct sockaddr_in sockaddr_in;  
  12. typedef struct sockaddr sockaddr;  
  13.   
  14. int main(int argc, char ** argv) {  
  15.   
  16.     sockaddr_in srv, cli;  
  17.     int fd, sfd, is_server;  
  18.   
  19.   
  20.     if (argc < 3) {  
  21.         printf(  
  22.                 "please put the arguments ,like ./a.out addr_ip  addr_port [server/client/broad]");  
  23.         return -1;  
  24.     }  
  25.     if (argc >= 4) {  
  26.         if (strcmp("server", argv[3]) == 0) {  
  27.             is_server = 1;  
  28.             printf("i am server \n");  
  29.         } else if (strcmp("client", argv[3]) == 0) {  
  30.             is_server = 0;  
  31.             printf("i am client \n");  
  32.         } else if(strcmp("broad",argv[3]) == 0){  
  33.             is_server = 2;  
  34.             printf("i want broad msg ,broad ip:X.X.X.255 \n");  
  35.         } else {  
  36.             printf("arguments error\n");  
  37.             return -1;  
  38.         }  
  39.     } else {//default  
  40.         is_server = -1 ;  
  41.         printf("i could recv and send msg  ,muti process\n");  
  42.     }  
  43.     memset(&srv, 0, sizeof(srv));  
  44.     srv.sin_port = htons(atoi(argv[2]));  
  45.     srv.sin_family = AF_INET;  
  46.   
  47.     if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
  48.         perror("server socket error");  
  49.     }  
  50.     if(is_server != -1){  
  51.         fd = 1-is_server ;  
  52.     }else{  
  53.         fd = fork();  
  54.         if (fd < 0) {  
  55.             perror("fork error");  
  56.             return -1;  
  57.         }  
  58.     }  
  59.   
  60.     if (0 == fd) { //service is_server == 1  
  61.         char recvbuf[1024];  
  62.         char ip[50];  
  63.         socklen_t len;  
  64.         int rnu = 0;  
  65.         srv.sin_addr.s_addr = INADDR_ANY ;  
  66.         int bfd;  
  67.         if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) {  
  68.             perror("bind error");  
  69.         }  
  70.         while (1) {  
  71.             memset(recvbuf, 0, sizeof(recvbuf));  
  72.             len = sizeof(sockaddr);  
  73.             if((rnu = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (sockaddr*) &cli,&len))<0) {  
  74.                 printf("recvfrom error");  
  75.             } else {  
  76.                 printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)), recvbuf);  
  77.                 if (is_server!=-1 && sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len) < 0) {  
  78.                     perror("sendto error");  
  79.                 }  
  80.                 //printf("send:%s\n",   inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip)));  
  81.                 sleep(2);  
  82.             }  
  83.         }  
  84.   
  85.         close(sfd);  
  86.   
  87.     }else if(-1 == fd){//broadcast  
  88.         char recvbuf[1024];  
  89.         char ip[50];  
  90.         socklen_t len;  
  91.         int rnu = 0;  
  92.   
  93.         srv.sin_addr.s_addr = INADDR_ANY ;  
  94.         int bfd;  
  95.         if ((bfd = bind(sfd, (sockaddr*) &srv, sizeof(sockaddr))) < 0) {  
  96.             perror("bind error");  
  97.         }  
  98.         while (1) {  
  99.             memset(recvbuf, 0, sizeof(recvbuf));  
  100.             len = sizeof(sockaddr);  
  101.             int on_broadcast = 1;  
  102.             int rs = setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &on_broadcast,  
  103.                     sizeof(on_broadcast));  
  104.             if ((rs = inet_pton(AF_INET, "10.33.28.255", &srv.sin_addr)) <= 0) {  
  105.                 perror("inet_pton error:");  
  106.             }  
  107.             strcpy(recvbuf, "this is broad\n");  
  108.             if (sendto(sfd, recvbuf, strlen(recvbuf), 0, (sockaddr*) &srv, len)  
  109.                     < 0) {  
  110.                 perror("sendto error");  
  111.             }  
  112.             printf("send:%s\n",  
  113.                     inet_ntop(AF_INET, &srv.sin_addr, ip, sizeof(ip)));  
  114.             sleep(2);  
  115.         }  
  116.   
  117.         close(sfd);  
  118.     }else {  
  119.         char sendbuf[1024], *p = sendbuf;  
  120.         ssize_t bs;  
  121.         char ip[50];  
  122.         socklen_t len = sizeof(sockaddr);  
  123.         inet_aton(argv[1], &srv.sin_addr);  
  124.         while (1) {  
  125.             memset(sendbuf, 0, sizeof(sendbuf));  
  126.             bs = sizeof(sendbuf);  
  127.             bs = getline(&p, &bs, stdin);  
  128.             bs = sendto(sfd, sendbuf, bs, 0, (sockaddr*) &srv, len);  
  129.             printf("sendto:%s", sendbuf);  
  130.             if(is_server!=-1 && (bs = recvfrom(sfd, sendbuf, sizeof(sendbuf), 0, (sockaddr*) &cli,&len))>0){  
  131.                 printf("from:%s,recv:%s",inet_ntop(AF_INET, &cli.sin_addr, ip, sizeof(ip)),sendbuf);  
  132.             }  
  133.         }  
  134.         close(sfd);  
  135.     }  

抱歉!评论已关闭.