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; 
就阻塞在那里,设置为非阻塞方式,返回为“无法立即完成一个非阻挡性套接字操作”,将这段代码放在一般程序中执行很好!
计算机一直在接受数据。。这到底是怎么回事儿呢????

解决方案 »

  1.   

    int       rr=recvfrom(socket1,buffer,sizeof       buffer,0,NULL,NULL)!=SOCKET_ERROR  ????
    把后两个参数改成
    struct       sockaddr_in       from;   
    int       fromlen       =sizeof(from);  
    试试!
      

  2.   

    跟你bind一样,recvfrom需要
    int               rr=recvfrom(socket1,buffer,sizeof(buffer),0,(struct       sockaddr*)&from,fromlen))!=SOCKET_ERROR 
     
      

  3.   

    hehaheha  谢谢你啊。
    我也采用了你的方法,但是还是不行。
    一执行到recvfrom(socket1,buffer,sizeof       buffer,0,NULL,NULL)就阻塞。而且特奇怪的是,有时间还是能执行的
    我昨天又重新建了一个工程,把代码写进去,一直好使。
    但是刚才不知怎么地,突然间就不行了。现在就一直不行了。和前两天的毛病如出一辙。
    怎么回事啊。搞得头都大了。
      

  4.   

    ioctlsocket 设置非阻塞模式通信
      

  5.   

    ioctlsocket   设置非阻塞模式通信还是不行。直接返回,但是还是没有收到数据。
    我使用另外一台计算机发送数据,不存在数据请求的问题。同一段代码,早上好好的,现在不知怎么了。用不了了。
      

  6.   

    Client不断的发送,Server不断的接收
      

  7.   

    邪了门了。我把程序放在别的计算机上,程序又好了。
    我以为是计算机 的问题,就把开发用的计算机重装了。但是还是不能接到对方发来的数据。
    又发现了一个新问题。虽然不能接到另一台计算机发送来的数据,但是在同一台计算机上用UPD调试助手向程序发数据,程序就能收着。这到底是怎么回事儿?
      

  8.   

    以前没改过UDP的,这两天弄了个,也是开始调试的时候使用非阻塞模式并且收发以及任务轮循,后来同事说等待任务的时候中间有间隔,也有可能导致recvfrom收不到数据。干脆就改成了使用Overlapped,置入完成端口当中去了。这样子倒是显得比以前负载轻得多了,也不会丢包(局域网)。