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

我强烈建议您在启用警告的情况下编译您的代码,以便及早发现分配问题。例如,如果您正在使用或,请使用-Walland标志-Wextragccg++

于 2012-11-08T11:07:50.013 回答