下面是我客户端的代码,但recvfrom()老是接收失败,大家帮我看看哪写错了
程序已包含 Ws2_32.lib#include <iostream.h>
#include <Winsock2.h>
#include <windows.h>void main()
{
WSADATA wsadata;
int err;
err=WSAStartup(0x0202,&wsadata);
if (err!=0)
return;
if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion)!=2)
{
WSACleanup();
return;
} SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5555);
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); int len=sizeof(SOCKADDR);
char sendbuf[200];
int retval;
char revbuf[200]; while(1)
{
cin>>sendbuf;
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR *)&addrSrv,len); retval=recvfrom(sockclient,revbuf,200,0,(SOCKADDR *)&addrSrv,&len);//这里错了,本来调试的时候会停在这等待数据的,
if (retval==SOCKET_ERROR)                                          //但却直接往下执行了
break;
cout<<revbuf<<endl;
}

closesocket(sockclient);
WSACleanup();
}

解决方案 »

  1.   

    如果是阻塞式的话有两种可能,一是有数据过来,第二种可能就是套接字本身因为种种原因失败了,可以通过GetLastError查看错误码,然后GOOGLE
      

  2.   

    不过,从你的程序来看似乎sockclient未绑定
      

  3.   

    是客户端,不用bind 
    客户端发给服务端的数据都能接收到
    就服务端发来的数据客户端接收不了 郁闷
      

  4.   

    不对吧,不用bind你客户端怎么侦听这个端口呢,而且,此时的客户端从角色上已经变成服务器端了,你还是先看看错误码吧,对了好像SOCKET不是用GetLastError的,是WSAGet...忘了,你GOOGLE下
      

  5.   

    UDP客户端是不用bind,用GetLastError 测了, 返回10054,远程主机强迫关闭了一个现有的连接。
    还是莫名其妙
      

  6.   

    晕,你服务器端怎么写的
    无非是创建一个socket,绑定一个socket,while recv socket;
    你觉得你写的客户端给这个结构有什么不同吗,什么是客户端,什么是服务器端,你清楚吗
      

  7.   

    服务端代码:#include <iostream.h>
    #include <winsock2.h>
    #include <windows.h>typedef struct
    {
    SOCKET socket;
    }RECVP;DWORD WINAPI FunReceive(LPVOID lp);void main()
    {
    WSADATA wsadata;
    int err;
    err=WSAStartup(0x0202,&wsadata);
    if (err!=0)
    return;
    if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion!=2))
    {
    WSACleanup();
    return;
    } SOCKET sockser=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrser;
    addrser.sin_family=AF_INET;
    addrser.sin_port=htons(5555);
    addrser.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(sockser,(SOCKADDR *)&addrser,sizeof(SOCKADDR)); char sendbuf[200]; SOCKADDR_IN addrclient;
    int len=sizeof(addrclient); RECVP *rep=new RECVP;
    rep->socket=sockser; HANDLE hthread;
    hthread=CreateThread(NULL,0,FunReceive,(LPVOID)rep,0,NULL);
    CloseHandle(hthread); while (1)
    {
    cin>>sendbuf;
    sendto(sockser,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR *)&addrclient,len);
    }

    closesocket(sockser);
    WSACleanup();
    }DWORD WINAPI FunReceive(LPVOID lp)
    {
    SOCKET socket=((RECVP *)lp)->socket;
    delete lp; SOCKADDR_IN addrclient;
    int len=sizeof(addrclient);

    char revbuf[200];
    int retval;
    while (1)
    {
    retval=recvfrom(socket,revbuf,200,0,(SOCKADDR *)&addrclient,&len);
    if (retval==SOCKET_ERROR)
    break;
    cout<<revbuf<<endl;
    }
    return 0;
    }
    客户端本来也是写成线程用来接受的,为了查错把线程去了。
      

  8.   

    服务端调试的时候都能停在recvfrom()那