1
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());
        }
    }
}

但它没有收到任何东西,它从游戏客户端接受套接字,然后什么也没发生,为什么!!?

4

2 回答 2

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()呼叫发送的所有内容。套接字纯粹是一个流,没有消息边界。

我只是提到这两件事,因为它们是初学者使用套接字时犯的“头号错误”。

于 2011-04-15T18:15:54.520 回答
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()可能会返回,或者它可能会返回,如果这是在找到一个字节之前必须查看的字节数。(我猜想类似的东西会很常见。:) 你可以使用,但如果你改变主意并使用. 因此,只需对分配和调用中的长度都使用一个常量。当您决定在未来使其充满活力时,将更难错过这一点。002000012sizeof buf;mallocrecv()

于 2011-02-11T11:57:57.563 回答