服务程序 recvfrom收不到数据

liyadong1981 2007-11-27 12:48:25
int Error;
SOCKET socket1;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
char szError[256];
DWORD dwError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
0,
szError,
sizeof(szError),
NULL);
::MessageBox(NULL,szError,"",0);


struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(8000); ///监听端口
local.sin_addr.s_addr=htonl(INADDR_ANY); ///本机

socket1=socket(AF_INET,SOCK_DGRAM,0);

bind(socket1,(struct sockaddr*)&local,sizeof local);
dwError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
0,
szError,
sizeof(szError),
NULL);
::MessageBox(NULL,szError,"",0);
while (1)
{
char buffer[1024]= "\0 ";
//printf( "waiting for message from others-------------\n ");
int rr=recvfrom(socket1,buffer,sizeof buffer,0,NULL,NULL)!=SOCKET_ERROR;
{ //MessageBox(NULL,"","",0);
FILE *file1;
file1=fopen( "c:\\Client.txt ", "a+ ");
fwrite(buffer,sizeof(char)*1024,rr,file1);
fclose(file1);
}
Sleep(500);
}

closesocket(socket1);

在服务程序中到int rr=recvfrom(socket1,buffer,sizeof buffer,0,NULL,NULL)!=SOCKET_ERROR;
就阻塞在那里,设置为非阻塞方式,返回为“无法立即完成一个非阻挡性套接字操作”,将这段代码放在一般程序中执行很好!
计算机一直在接受数据。。

这到底是怎么回事儿呢????
...全文
352 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2007-11-30
  • 打赏
  • 举报
回复
以前没改过UDP的,这两天弄了个,也是开始调试的时候使用非阻塞模式并且收发以及任务轮循,后来同事说等待任务的时候中间有间隔,也有可能导致recvfrom收不到数据。干脆就改成了使用Overlapped,置入完成端口当中去了。这样子倒是显得比以前负载轻得多了,也不会丢包(局域网)。
liyadong1981 2007-11-30
  • 打赏
  • 举报
回复
UP,UP
liyadong1981 2007-11-29
  • 打赏
  • 举报
回复
邪了门了。我把程序放在别的计算机上,程序又好了。
我以为是计算机 的问题,就把开发用的计算机重装了。但是还是不能接到对方发来的数据。
又发现了一个新问题。虽然不能接到另一台计算机发送来的数据,但是在同一台计算机上用UPD调试助手向程序发数据,程序就能收着。

这到底是怎么回事儿?
liyadong1981 2007-11-28
  • 打赏
  • 举报
回复
ioctlsocket 设置非阻塞模式通信还是不行。

直接返回,但是还是没有收到数据。


我使用另外一台计算机发送数据,不存在数据请求的问题。

同一段代码,早上好好的,现在不知怎么了。用不了了。
stivenjia 2007-11-28
  • 打赏
  • 举报
回复
可能由于对方不能及时应答你的数据请求
stivenjia 2007-11-28
  • 打赏
  • 举报
回复
ioctlsocket 设置非阻塞模式通信
liyadong1981 2007-11-28
  • 打赏
  • 举报
回复
hehaheha 谢谢你啊。
我也采用了你的方法,但是还是不行。
一执行到recvfrom(socket1,buffer,sizeof buffer,0,NULL,NULL)就阻塞。

而且特奇怪的是,有时间还是能执行的
我昨天又重新建了一个工程,把代码写进去,一直好使。
但是刚才不知怎么地,突然间就不行了。现在就一直不行了。

和前两天的毛病如出一辙。
怎么回事啊。搞得头都大了。
stivenjia 2007-11-28
  • 打赏
  • 举报
回复
Client不断的发送,Server不断的接收
hehaheha 2007-11-27
  • 打赏
  • 举报
回复
跟你bind一样,recvfrom需要
int rr=recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,fromlen))!=SOCKET_ERROR
hehaheha 2007-11-27
  • 打赏
  • 举报
回复
int rr=recvfrom(socket1,buffer,sizeof buffer,0,NULL,NULL)!=SOCKET_ERROR ????
把后两个参数改成
struct sockaddr_in from;
int fromlen =sizeof(from);
试试!

18,356

社区成员

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

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