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()また、送信者が 1 回の呼び出しで送信するすべてを受信するとは限りません。ソケットは純粋にストリームであり、メッセージ境界はありません。

これらの 2 つのことは、初心者がソケットで犯す「最大の間違い」であるためです。

于 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着信接続のアドレスを見つけるために再利用しないでください。何も問題はないかもしれませんが、プログラム内の 2 つの異なるものに同じ変数を使用したことを知ることは、プログラムが大きくなるほど難しくなります。各変数に特定のタスクを与え、十分な理由がある変数のみを再利用してください。

strlen(buf)しかし、問題はその呼び出しである可能性が最も高いです。char buf[500]スタックに割り当てたものはゼロになりません。偶然その場所にバイトがあった場合は をstrlen()返すか、バイトを見つける前に調べなければならないバイト数である場合は を返します。(次のようなものが一般的だと思います。:) を使用できますが、途中で気が変わって を使用して配列を割り当てると、それは脆弱になる可能性があります。したがって、割り当てと呼び出しの両方の長さに定数を使用してください。将来的に動的にすることを決定した場合、それを見逃すことは難しくなります。002000012sizeof buf;mallocrecv()

于 2011-02-11T11:57:57.563 に答える