udp程序的服务端,出了个错误
#include <winsock.h>
#include <iostream>
#pragma comment(lib,"ws2_32")
using namespace std;int main(int argc,int *argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
 

wVersionRequested = MAKEWORD( 2, 2 );
  err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{
     /* Tell the user that we could not find a usable */
     /* WinSock DLL.                                  */
     return -1;
}
 
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater    */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we      */
/* requested.                                        */
 
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) 
{
    /* Tell the user that we could not find a usable */
     /* WinSock DLL.                                  */
     WSACleanup( );
     return -1; 
}
/*create socket*/
SOCKET sSrv=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==sSrv)
{
cout<<"create socket error"<<endl;
WSACleanup();
return -1;
}
/*bind*/
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6001);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
if(SOCKET_ERROR==bind(sSrv,(SOCKADDR *)&addrSrv,sizeof(addrSrv)))
{
cout<<"bind failed"<<endl;
closesocket(sSrv);
WSACleanup();
return -1;
}
/*recvfrom*/
char buf[1024];
ZeroMemory(buf,1024);
SOCKADDR_IN addrClient;
int len=sizeof(addrClient);
if(SOCKET_ERROR==recvfrom(sSrv,buf,1024,0,(SOCKADDR *)&addrClient,&len))貌似就是这里错了
{
cout<<"recf from failed"<<endl;
closesocket(sSrv);
WSACleanup();
return -1;
}
cout<<buf<<endl;
/*closesocket*/
closesocket(sSrv);
WSACleanup();
return 0;
}
运行以后显示recf from failed,应该是那个recvfrom函数不知怎么返回了个SOCKET_ERROR,请高手指导一下是怎么回事。

解决方案 »

  1.   

    没有客户端给服务端发送数据,所以服务端无法接收数据,即recvfrom没有接收到数据,返回SOCKET_ERROR。
      

  2.   

    recv没有收到数据应该是挂起的,我启动客户端,客户端也给我现实发送失败,我想应该是先启动服务器。
      

  3.   

    SOCKET sSrv=socket(AF_INET,SOCK_STREAM,0);
    你这是基于TCP的协议。
    SOCK_STREAM 改为 SOCK_DGRAM
      

  4.   

    SOCKET sSrv=socket(AF_INET,SOCK_STREAM,0);
    你这是基于TCP的协议。
    SOCK_STREAM 改为 SOCK_DGRAM
      

  5.   

    4楼正解,
    2楼错了,recvfrom也是阻塞函数,
    所以一般MFC中不会直接用,
    会用WSAAsyncSelect或IO端口那些WINSOCK IO模型写 
      

  6.   

    最近我也在做有关网络编程的毕业设计,遇到UDP广播,recvfrom(s,buf,256,0);之后字符不能全部显示,这个recvfrom()该怎么用呢