首页 > 编程 > C++ > 正文

距离详解Linux下的UDP方式通讯

2020-05-23 14:13:43
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了距离详解Linux下的UDP方式通讯,是深入Linux系统编程中的基础,需要的朋友可以参考下

UDP方式点对点通讯

 

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <sys/types.h> 
  4. #include <netinet/in.h> 
  5. #include <sys/socket.h> 
  6. #include <errno.h> 
  7. #include <stdlib.h> 
  8. #include <arpa/inet.h> 
  9.  
  10. int main(int argc, char **argv) 
  11. { 
  12. struct sockaddr_in s_addr; 
  13. struct sockaddr_in c_addr; 
  14. int sock; 
  15. socklen_t addr_len; 
  16. int len; 
  17. char buff[128]; 
  18.  
  19. /* 创建 socket , 关键在于这个 SOCK_DGRAM */ 
  20. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
  21. perror("socket"); 
  22. exit(errno); 
  23. } else 
  24. printf("create socket./n/r"); 
  25.  
  26. memset(&s_addr, 0, sizeof(struct sockaddr_in)); 
  27. /* 设置地址和端口信息 */ 
  28. s_addr.sin_family = AF_INET; 
  29. if (argv[2]) 
  30. s_addr.sin_port = htons(atoi(argv[2])); 
  31. else 
  32. s_addr.sin_port = htons(7838); 
  33. if (argv[1]) 
  34. s_addr.sin_addr.s_addr = inet_addr(argv[1]); 
  35. else 
  36. s_addr.sin_addr.s_addr = INADDR_ANY; 
  37.  
  38. /* 绑定地址和端口信息 */ 
  39. if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) { 
  40. perror("bind"); 
  41. exit(errno); 
  42. } else 
  43. printf("bind address to socket./n/r"); 
  44.  
  45. /* 循环接收数据 */ 
  46. addr_len = sizeof(c_addr); 
  47. while (1) { 
  48. len = recvfrom(sock, buff, sizeof(buff) - 1, 0, 
  49. (struct sockaddr *) &c_addr, &addr_len); 
  50. if (len < 0) { 
  51. perror("recvfrom"); 
  52. exit(errno); 
  53. } 
  54.  
  55. buff[len] = '/0'; 
  56. printf("收到来自%s:%d的消息:%s/n/r", 
  57. inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff); 
  58. } 
  59. return 0; 
  60. } 

客户端源代码如下:

 

 
  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <sys/types.h> 
  4. #include <netinet/in.h> 
  5. #include <sys/socket.h> 
  6. #include <errno.h> 
  7. #include <stdlib.h> 
  8. #include <arpa/inet.h> 
  9.  
  10.  
  11. int main(int argc, char **argv) 
  12. { 
  13. struct sockaddr_in s_addr; 
  14. int sock; 
  15. int addr_len; 
  16. int len; 
  17. char buff[128]; 
  18.  
  19. /* 创建 socket , 关键在于这个 SOCK_DGRAM */ 
  20. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
  21. perror("socket"); 
  22. exit(errno); 
  23. } else 
  24. printf("create socket./n/r"); 
  25.  
  26. /* 设置对方地址和端口信息 */ 
  27. s_addr.sin_family = AF_INET; 
  28. if (argv[2]) 
  29. s_addr.sin_port = htons(atoi(argv[2])); 
  30. else 
  31. s_addr.sin_port = htons(7838); 
  32. if (argv[1]) 
  33. s_addr.sin_addr.s_addr = inet_addr(argv[1]); 
  34. else { 
  35. printf("消息必须有一个接收者!/n"); 
  36. exit(0); 
  37. } 
  38.  
  39. /* 发送UDP消息 */ 
  40. addr_len = sizeof(s_addr); 
  41. strcpy(buff, "hello i'm here"); 
  42. len = sendto(sock, buff, strlen(buff), 0, 
  43. (struct sockaddr *) &s_addr, addr_len); 
  44. if (len < 0) { 
  45. printf("/n/rsend error./n/r"); 
  46. return 3; 
  47. } 
  48.  
  49. printf("send success./n/r"); 
  50. return 0; 
  51. } 

编译程序用下列命令:

 

 
  1. gcc -Wall simple-udpserver.c -o server 
  2. gcc -Wall simple-udpclient.c -o client 

运行程序用下列命令:

 

 
  1. ./server 127.0.0.1 7838 
  2.  
  3. ./client 127.0.0.1 7838 

UDP方式广播通讯

源代码变成下面的:

 

 
  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <sys/types.h> 
  4. #include <netinet/in.h> 
  5. #include <sys/socket.h> 
  6. #include <errno.h> 
  7. #include <stdlib.h> 
  8. #include <arpa/inet.h> 
  9.  
  10. int main(int argc, char **argv) 
  11. { 
  12. struct sockaddr_in s_addr; 
  13. int sock; 
  14. int addr_len; 
  15. int len; 
  16. char buff[128]; 
  17. int yes; 
  18.  
  19. /* 创建 socket */ 
  20. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
  21. perror("socket"); 
  22. exit(errno); 
  23. } else 
  24. printf("create socket./n/r"); 
  25.  
  26. /* 设置通讯方式对广播,即本程序发送的一个消息,网络上所有主机均可以收到 */ 
  27. yes = 1; 
  28. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); 
  29. /* 唯一变化就是这一点了 */ 
  30.  
  31. /* 设置对方地址和端口信息 */ 
  32. s_addr.sin_family = AF_INET; 
  33. if (argv[2]) 
  34. s_addr.sin_port = htons(atoi(argv[2])); 
  35. else 
  36. s_addr.sin_port = htons(7838); 
  37. if (argv[1]) 
  38. s_addr.sin_addr.s_addr = inet_addr(argv[1]); 
  39. else { 
  40. printf("消息必须有一个接收者!/n"); 
  41. exit(0); 
  42. } 
  43.  
  44. /* 发送UDP消息 */ 
  45. addr_len = sizeof(s_addr); 
  46. strcpy(buff, "hello i'm here"); 
  47. len = sendto(sock, buff, strlen(buff), 0, 
  48. (struct sockaddr *) &s_addr, addr_len); 
  49. if (len < 0) { 
  50. printf("/n/rsend error./n/r"); 
  51. return 3; 
  52. } 
  53.  
  54. printf("send success./n/r"); 
  55. return 0; 
  56. } 

编译这个程序用下列命令:

 

 
  1. gcc -Wall broadc-udpclient.c -o client 

运行程序用下列命令:

 

 
  1. ./client 192.168.0.255 7838 

就会往192.168.0网络内所有主机发消息。

其它主机如果运行了服务端:

 

 
  1. ./server 自己的IP地址 7838 

则都会收到上述客户端发的消息了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表