socket坏文件描述符

时间:2012-11-08 10:39:46

标签: sockets file-descriptor

我想写一个多客户端套接字程序,
但是当接受阶段我得到Bad文件描述符 我该如何更正我的代码?谢谢!

这是我的代码
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);

} 

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些错误 首先,您需要在childclientfd的作业周围使用括号。

68应更改为

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

和第76行应为

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

此外,您必须从分叉流程returnexit(),因为您已经关闭了侦听套接字。

所以在第exit(0);

之后添加return 0;94

我强烈建议您在启用警告的情况下编译代码,以便及早发现分配问题。例如,如果您使用-Wall-Wextra

,请使用gccg++标记