国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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 

則都會收到上述客戶端發的消息了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和顺县| 鸡泽县| 唐河县| 交城县| 确山县| 安乡县| 醴陵市| 黔东| 若尔盖县| 汤阴县| 防城港市| 娄底市| 罗甸县| 镇平县| 天气| 工布江达县| 龙门县| 曲水县| 万荣县| 温宿县| 蛟河市| 隆林| 探索| 陇西县| 晋州市| 屏东县| 新安县| 德清县| 改则县| 互助| 金沙县| 海阳市| 敖汉旗| 保德县| 多伦县| 清徐县| 台州市| 邢台县| 报价| 鄂托克前旗| 金塔县|