Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149093
  • 博文数量: 26
  • 博客积分: 645
  • 博客等级: 上士
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-05 15:00
文章分类

全部博文(26)

文章存档

2014年(1)

2013年(1)

2011年(22)

2010年(1)

2009年(1)

我的朋友

分类: WINDOWS

2011-09-04 21:49:25

遇到一个问题,本机IP修改之后,UDP收不到包了。走查代码发现socket绑定时填写的IP不是INADDR_ANY,而是绑成了固定IP,并且修改IP时没有重新绑socket。
为了验证这种情况,专门写了个程序验证。(只有一台linux,只能用win32写)
接受端:
  1. // winsock.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include <Winsock2.h>

  5. int main(int argc, char* argv[])
  6. {
  7.     SOCKET sock1;
  8.     WSADATA wdate;
  9.     struct sockaddr_in localaddr;
  10.     struct sockaddr_in destaddr;
  11.     int count;
  12.     int len;
  13.     char buff[1024];
  14.     char ip[16];

  15.     if(WSAStartup(MAKEWORD(2,1), &wdate))
  16.     {
  17.         printf("error in %s:%d.\n", __FILE__, __LINE__);
  18.         WSACleanup();
  19.         return 1;
  20.     }
  21.     printf("WSA初始化成功.\n");
  22.     memset((void*)ip, 0, sizeof(ip));
  23.     printf("输入本机IP:");
  24.     scanf("%s", ip);
  25.     len = sizeof(destaddr);
  26.     localaddr.sin_family=AF_INET;
  27.     localaddr.sin_port=htons(27015); ///监听端口
  28.     localaddr.sin_addr.s_addr=inet_addr(ip); ///注意!此处绑定固定IP

  29.     sock1 = socket(AF_INET, SOCK_DGRAM, 0);
  30.     bind(sock1, (struct sockaddr *)&localaddr, sizeof(localaddr));
  31.     count = 0;
  32.     printf("waiting dgram....\n");
  33.     while(1)
  34.     {
  35.         memset((void *)buff, 0, sizeof(buff));
  36.         if(recvfrom(sock1, buff, sizeof(buff), 0, (struct sockaddr*)&destaddr, &len) == SOCKET_ERROR)
  37.         {
  38.             printf("error in %s:%d.\n", __FILE__, __LINE__);
  39.             closesocket(sock1);
  40.             WSACleanup();
  41.             return 1;
  42.         }
  43.         count++;
  44.         printf("recv from%s:%s\n", inet_ntoa(destaddr.sin_addr), buff);

  45.         if(count > 100)
  46.             break;
  47.     }
  48.     closesocket(sock1);
  49.     WSACleanup();
  50.     return 0;
  51. }

发送端:

 

  1. // winsocksender.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include
  5. int main(int argc, char* argv[])
  6. {
  7. SOCKET sock1;
  8. WSADATA wdate;
  9. struct sockaddr_in localaddr;
  10. struct sockaddr_in destaddr;
  11. int count;
  12. int len;
  13. char ip[16];
  14. char buff[1024];
  15. if(WSAStartup(MAKEWORD(2,1), &wdate))
  16. {
  17. printf("error in %s:%d.\n", __FILE__, __LINE__);
  18. WSACleanup();
  19. return 1;
  20. }
  21. printf("WSA初始化成功.\n");
  22. printf("输入对端主机IP:");
  23. scanf("%s", ip);
  24. len = sizeof(destaddr);
  25. destaddr.sin_family=AF_INET;
  26. destaddr.sin_port=htons(27015); ///对端监听端口
  27. destaddr.sin_addr.s_addr=inet_addr(ip); ///对端IP
  28. sock1 = socket(AF_INET, SOCK_DGRAM, 0);
  29. //bind(sock1, (struct sockaddr *)&localaddr, sizeof(localaddr));
  30. count = 1;
  31. printf("start sending dgram....\n", count);
  32. while(1)
  33. {
  34. memset((void *)buff, 0, sizeof(buff));
  35. sprintf(buff, "dgram %d from sender.\n", count);
  36. if(sendto(sock1, buff, sizeof(buff), 0, (struct sockaddr*)&destaddr, len) == SOCKET_ERROR)
  37. {
  38. printf("error in %s:%d.\n", __FILE__, __LINE__);
  39. closesocket(sock1);
  40. WSACleanup();
  41. return 1;
  42. }
  43. printf("dgram %d have sent.\n", count);
  44. Sleep(10000);
  45. count++;
  46. if(count > 100)
  47. break;
  48. }
  49. closesocket(sock1);
  50. WSACleanup();
  51. return 0;
  52. }

实验:

1、打开接收端,输入本机IP,等待收包。

2、打开发送端,输入目的IP,开始发送。

此时接收端可以正常收包。

3、修改接收端 IP地址。

4、重启发送端,输入新的目的IP地址,开始发送。

此时接收端不能收包。

5、重启接收端,输入新IP,等待收包。

此时接受正常。

阅读(8851) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~