0

マルチ クライアント ソケット プログラムを作成したいのですが
、受け入れの段階で不正なファイル記述子が表示されます。
コードを修正するにはどうすればよいですか? ありがとう!

ここに私のコードがあります
http://codepad.org/q0N1jTgz
ありがとう!
ここにコードの私の部分があります!

while(1)
{
    struct sockaddr_in client_addr;
    int addrlen = sizeof(client_addr);

    /*Accept*/
    if(clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen) < 0)
    {
        perror("Accpet Error");
        close(sockfd);
        exit(-1);
    }

    /*Fork process*/
    if(child = fork() < 0)
    {
        perror("Fork Error");
        close(sockfd);
        exit(-1);
    }
    else if(child == 0)
    {
        int my_client = clientfd;
        close(sockfd);

        send(my_client, welcome, sizeof(welcome), 0);

        while ((res = recv(my_client, buffer1, sizeof(buffer1), 0)) > 0)
        {
            string command(buffer1);
            cout << "receive from client:" << command << ", " << res << " bytes\n";
            memset(buffer1, '\0', sizeof(buffer1));     
        }
    }

    close(clientfd);

} 
4

1 に答える 1

2

コードにはいくつかのバグがあります。最初に、との割り当てを括弧で囲む必要がありchildますclientfd

68をに変更する必要があります

 if((clientfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addrlen)) < 0)

と行76はする必要があります

  if((child = fork()) < 0)

さらに、リスニングソケットをすでに閉じているため、フォークされたプロセスから、returnまたはフォークされたプロセスから実行する必要があります。exit()

したがって、行を追加exit(0);またはreturn 0;後に94

割り当ての問題を早期に発見するために、警告を有効にしてコードをコンパイルすることを強くお勧めします。たとえば、またはを使用している場合は-Wall-Wextraフラグを使用しますgccg++

于 2012-11-08T11:07:50.013 に答える