首页 > 编程 > 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. struct sockaddr_in s_addr; 
  12. struct sockaddr_in c_addr; 
  13. int sock; 
  14. socklen_t addr_len; 
  15. int len; 
  16. char buff[128]; 
  17.  
  18. /* 创建 socket , 关键在于这个 SOCK_DGRAM */ 
  19. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
  20. perror("socket"); 
  21. exit(errno); 
  22. else 
  23. printf("create socket./n/r"); 
  24.  
  25. memset(&s_addr, 0, sizeof(struct sockaddr_in)); 
  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. s_addr.sin_addr.s_addr = INADDR_ANY; 
  36.  
  37. /* 绑定地址和端口信息 */ 
  38. if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) { 
  39. perror("bind"); 
  40. exit(errno); 
  41. else 
  42. printf("bind address to socket./n/r"); 
  43.  
  44. /* 循环接收数据 */ 
  45. addr_len = sizeof(c_addr); 
  46. while (1) { 
  47. len = recvfrom(sock, buff, sizeof(buff) - 1, 0, 
  48. (struct sockaddr *) &c_addr, &addr_len); 
  49. if (len < 0) { 
  50. perror("recvfrom"); 
  51. exit(errno); 
  52.  
  53. buff[len] = '/0'
  54. printf("收到来自%s:%d的消息:%s/n/r"
  55. inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff); 
  56. return 0; 

客户端源代码如下:

 

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

编译程序用下列命令:

 

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

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

 

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

运行程序用下列命令:

 

 
  1. ./client 192.168.0.255 7838 

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

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

 

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

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


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