套接字没有从客户端接收

时间:2011-02-11 11:39:47

标签: c++ sockets winsock2

int main()
{
    CRc5 dec;
    WSADATA wsaData;
    int err;
    if((err =WSAStartup(0x0002, &wsaData)) !=0)
    {
        printf("Init WSAStartup() failed[%d].", err);
        return false;
    }
    //socket structure
    SOCKADDR_IN addr;//addr = socket structure
    int addrlen = sizeof(addr);

    //making the socket
    SOCKET sListen;//listenig to the incoming connections
    SOCKET sConnect;//operating the connection

    //setuping the socket
    sConnect=socket(AF_INET,SOCK_STREAM,NULL);//sock_stream = that the socket is a connection_oriented

    //setup the structure
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");// ip of the connection
    addr.sin_family= AF_INET;
    //seting the prot
    addr.sin_port= htons(9958);

    //sertuping Listen socket
    sListen=socket(AF_INET,SOCK_STREAM,NULL);
    //binding connection
    bind(sListen,(SOCKADDR*)&addr,sizeof(addr));
    //listening 
    listen(sListen,SOMAXCONN);//listing with out any limit
    printf("Attempting Socket Connection\n");
    printf("Wating For An Incoming Connection!\n");
    for(;;)
    {
        if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
        {
            char buf[500];
            int len = strlen(buf);
            recv(sConnect,buf,len,0);

        }
        else
        {
            printf("Error accepting %d\n",WSAGetLastError());
        }
    }
}

但是它没有收到任何接受来自游戏客户端的套接字的东西,然后没有发生任何事情的原因!!?

2 个答案:

答案 0 :(得分:1)

         char buf[500];
         int len = strlen(buf);
         recv(sConnect,buf,len,0);

strlen(buf)显然是错误的。不知道这是recv()不起作用的原因,但您应该肯定使用sizeof(buf)

您还应该知道recv(socket, buf, 500, 0)不一定会收到500个字节,即使发件人发送了500个字节。它可能只接收1个字节或任何数字最多 500。

此外,它不一定会收到发件人通过单个send()电话发送的所有内容。套接字纯粹是一个流,没有消息边界。

我只是提到这两件事,因为它们是初学者用插座制作的“头号错误”。

答案 1 :(得分:0)

{
    if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
    {
        char buf[500];
        int len = strlen(buf);
        recv(sConnect,buf,len,0);

    }

您可能不应该重复使用addr来查找传入连接的地址。可能没有任何错误的,但是知道你在程序中对两个不同的东西使用相同的变量会越大,你的程序就越大。为每个变量赋予一个特定的任务,并且只有充分理由才能重用变量。

但问题很可能是strlen(buf)致电。没有任何内容将您在堆栈上分配的char buf[500]归零。如果strlen()字节偶然位于该位置,您的0可能会返回0,或者2000可能会返回0,如果这是必须查看的字节数在找到12字节之前通过。 (我猜想像sizeof buf;这样的东西会很常见。:)你可以使用malloc,但如果你改变主意并使用recv()分配数组,这可能会很脆弱。因此,只需对分配中的长度和{{1}}调用使用常量。当你决定将来变得充满活力时,很难想象它。