繁体   English   中英

套接字未从客户端接收

[英]Socket not receiving from the client

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

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

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

strlen(buf)显然是错误。 不知道这是recv()无法正常工作的原因,但是您一定要使用sizeof(buf)代替。

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

而且,它不一定会通过单个send()调用来接收发送方发送的所有内容。 套接字纯粹是一个流,没有消息边界。

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

{
    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()调用中都使用一个常量即可。 当您决定将来使其变得动态时,将很难错过它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM