请问一个小的udp程序recvfrom的问题

yalechenfly 2008-08-27 02:56:18
程序功能非常简单,就是写一个客户端程序发送给服务器端数据,然后recvfrom;

现在的问题是数据能发送到服务器端,客户端通过抓包软件也每次都能抓到服务器端返回的udp包,端口ip等都正确,

请问为什么我sendto成功,但是recvfrom总是超时呢?而且明明数据是发到我本机上来了。

我曾试着很多种其他方式都是一样的结果,请大侠给指点啊,分数不成问题,不够再加!
---------------------------------------
SOCKET socket1;
InitWinsock();
struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(54321); ///server的监听端口
server.sin_addr.s_addr=inet_addr("192.168.137.101"); ///server的地址 (曾试过专门定一个接收socket,然后用INADDR_ANY代替这个地址,也不行)


socket1=socket(AF_INET,SOCK_DGRAM,0);
//设置接收超时30秒
int TimeOut = 30000;
if( ::setsockopt(socket1,SOL_SOCKET,SO_RCVTIMEO,(char*)&TimeOut,sizeof(TimeOut)) == SOCKET_ERROR )
{
::closesocket(socket1);
WSACleanup( );
}
{ //char buffer[1024]="\0";
if (sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)
{
if(recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,&len)!=SOCKET_ERROR)
//printf("rece from server:%s\n",buffer);
AfxMessageBox("成功");
else
{
int n = WSAGetLastError();//5780
int m = n;
//AfxMessageBox("error:%d",n);
}
}
}
closesocket(socket1);
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-08-27
  • 打赏
  • 举报
回复
把你的程序换一台机器测试一下看.
yalechenfly 2008-08-27
  • 打赏
  • 举报
回复
xiexie,不过我又更改程序定义了两个socket,一个用来发,一个bind后用来收,问题还是处在recvfrom处。

请问哪位高手给指点啊
mystudy_zhou 2008-08-27
  • 打赏
  • 举报
回复
不bind,你叫应用层把数据存在哪儿?
僵哥 2008-08-27
  • 打赏
  • 举报
回复
5780:
子网对象‘%1’出现在 DS 中的 Configuration\Sites\Subnets 容器中。名称在句法上无效。有效的 句法是 xx.xx.xx.xx/yy;其中,xx.xx.xx.xx 是有效的 IP 子网编号, yy 是子网掩码中的位数。 改正子网对象的名称。
yalechenfly 2008-08-27
  • 打赏
  • 举报
回复
给了我提示,我是在服务器端程序中没有把目的和源port交互后再返回来,谢谢僵哥了
yalechenfly 2008-08-27
  • 打赏
  • 举报
回复
您说的端口是port吗?
我把两个socket(一个用来发,一个用来收)的端口号都设为11111的话,一个是发送到服务器端的port,另一个是接收时监听的port,这样也有问题吗?
谢谢僵哥,可以看出你是个高手!!
僵哥 2008-08-27
  • 打赏
  • 举报
回复
两个分别绑定在不同的端口(端口在此之前未被占用)应该是不会存在问题的.
其实使用一个端口就可以完成,但是需要注意的是:

Windows XP: Controls whether UDP PORT_UNREACHABLE messages are reported. Set to TRUE to enable reporting. Set to FALSE to disable reporting

http://support.microsoft.com/kb/263823
yalechenfly 2008-08-27
  • 打赏
  • 举报
回复
谢谢各位,现在我若分开两个程序一个程序中定义SOCKET变量来向服务器发,另一个程序也定义SOCKET变量用来从服务器端收,这样二者都没有问题,若同一个程序中定义两个socket总是会有一个不能起作用,请问为什么?谢谢了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧