【问题标题】:socket bad file descriptor套接字错误的文件描述符
【发布时间】:2012-11-08 10:39:46
【问题描述】:

我想写一个多客户端socket程序,
但是在接受阶段我得到了错误的文件描述符。
如何更正我的代码?谢谢!

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

} 

【问题讨论】:

  • 请通过editing it在您的问题中包含您代码的相关部分。键盘随时会消失。

标签: sockets file-descriptor


【解决方案1】:

您的代码中有一些错误 首先,您需要在 childclientfd 的分配周围使用括号。

68 行应改为

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

76 行应该是

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

此外,由于您已经关闭了侦听套接字,因此您必须从分叉进程中 returnexit()

所以在94 行之后添加exit(0);return 0;

我强烈建议您在编译代码时启用警告,以便及早发现分配问题。例如,如果您使用的是 gccg++,请使用 -Wall-Wextra 标志

【讨论】:

  • 非常感谢,对我很有用,我会更正我的代码并重试。谢谢!!!!!!!!!!
  • 现在,程序运行完美,但还有一个问题是clientfd总是同一个数字,服务器无法识别究竟是哪个客户端发送的消息,我该如何解决?谢谢!
  • @ChengChung-Hao 唯一能区分客户端的就是他们的IP地址:端口,你可以通过getpeername()从socket FD获取。
猜你喜欢
  • 2019-01-28
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
相关资源
最近更新 更多