c++ - 接受错误 : Bad file descriptor

标签 c++ c linux

编辑:最小、完整和可验证的示例位于下面的注释中,代码实际上有效,问题出在不同的区域。抱歉,发帖错误,我现在无法删除它。

我知道,已经有一些关于此的页面,但我确实尝试了所有方法,但没有任何效果。我一直遇到这个错误,我的代码如下所示:

int server_socket, new_socket;
struct sockaddr_in server;
bzero((char *) &server, sizeof(server));

server_socket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
if(server_socket < 0) error("ERROR opening socket");

server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(port_number);

if(bind(server_socket, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) < 0) error("ERROR on binding");

if(listen(server_socket, 5) < 0) error("Failed to listen for connections.");

while(1)
{
  struct sockaddr_in client;
  unsigned int client_len = sizeof(struct sockaddr_in);
  bzero((char *) &client, client_len); 

  if((new_socket = accept(server_socket, (struct sockaddr *) &client, &client_len)) < 0) 
  {
    if(errno == EAGAIN) continue;
    else error("ERROR on accept");
  }

  if((pid = fork()) > 0)
  {  // this is parent process
      close(new_socket);
  }

  else if(pid == 0)
  {  // this is a child process that will handle an incoming request
    long_pid = (long) getpid();   // current child's PID
    close(server_socket);  
    server_socket = -1;       //closing parent socket
    printf("A new connection accepted from blablabla, port %d by process %ld\n", port_number, long_pid);

   // ---- doing some staff, running the program
EDIT: while((msg_size = read(new_socket, received_data, BUFFER_SIZE)) >0)
  //  ---- when Im done:
      printf("closing newsock\n");
      close(new_socket);  // close the new socket
      new_socket = -1;
      exit(0);
    }
  }
  else error("fork() failed");
}

// close the server 
printf("closing an original socket\n");
close(server_socket);  // close an original server socket 
return 0;
}

我以前使用非阻塞套接字时没有遇到这个问题。所以问题可能与他们有关。

最佳答案

如果我填写空白以使其成为可编译的示例(请下次发布mcve)

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <errno.h>
#include <arpa/inet.h>

#define port_number 2222
void error(char const *Msg)
{
    perror(Msg);
    exit(1);
}
int main()
{
    pid_t pid; long long_pid;
    int server_socket, new_socket;
    struct sockaddr_in server;
    bzero((char *) &server, sizeof(server));

    server_socket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
    if(server_socket < 0) error("ERROR opening socket");

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port_number);

    if(bind(server_socket, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) < 0) error("ERROR on binding");

    if(listen(server_socket, 5) < 0) error("Failed to listen for connections.");

    while(1)
    {
      struct sockaddr_in client;
      unsigned int client_len = sizeof(struct sockaddr_in);
      bzero((char *) &client, client_len); 

      if((new_socket = accept(server_socket, (struct sockaddr *) &client, &client_len)) < 0) 
      {
        if(errno == EAGAIN) continue;
        else error("ERROR on accept");
      }

      if((pid = fork()) > 0)
      {  // this is parent process
          close(new_socket);
      }

      else if(pid == 0)
      {  // this is a child process that will handle an incoming request
        long_pid = (long) getpid();   // current child's PID
        close(server_socket);  
        server_socket = -1;       //closing parent socket
        printf("A new connection accepted from blablabla, port %d by process %ld\n", port_number, long_pid);

//      ---- doing some staff, running the program
//      ---- when Im done:
          printf("closing newsock\n");
          close(new_socket);  // close the new socket
          new_socket = -1;
          _exit(0);
      }
      else error("fork() failed");
    }

    // close the server 
    printf("closing an original socket\n");
    close(server_socket);  // close an original server socket 
    return 0;
}

它似乎工作没有任何问题。

显然,您正在父进程中建立带有错误检查的监听套接字,然后父进程不会对关闭它的监听套接字执行任何操作,因此您不应该从父进程收到该错误。

我的猜测是您可能错误地继续了子级中的循环(在您未显示的部分中)。

关于c++ - 接受错误 : Bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390319/

相关文章:

c++ - 在搜索算法上获得微秒输出

c++ - operator<< 函数在转储成员函数方面的通用实现

c - 在 Function 中使用 malloc 时出错

c - 从控制台读取并存储地址 Mac

c - 使用 2 个管道在子进程和父进程之间进行管道通信

php - 如何检查php作业实例

c++ - C++14 中的有符号位域

c++ - 如何将 makefile 从生成可执行文件更改为生成共享库

linux - Linux 上的图像处理和识别实现。如何?

linux - 如何配置 GCC 默认显示所有警告?