【问题标题】:segmentation fault with accept() on linuxlinux上accept()的分段错误
【发布时间】:2015-01-23 03:50:22
【问题描述】:

我在 linux 上的客户端/服务器程序有问题。 我编写了一个服务器程序,它将循环数据发送到一个连接的客户端。 现在我想检测客户端是否关闭了与服务器的连接。当从客户端关闭连接时,我想用 accept(...) 等待新连接。 这是我的代码的关键部分:

error = send(client_sock, Zeichen, 1, MSG_NOSIGNAL);
if(error < 0)
{
    connected = 0;
    printf("Error, write on TCP Socket failed!!! Reconnecting... \r\n");
    close(serverSocket);
    initServer();
}

int initServer(void)
{
    int *new_sock;
    socklen_t size;
    struct sockaddr_in server, client;

    serverSocket = socket(AF_INET , SOCK_STREAM , 0);       //Create socket
    if (serverSocket == -1)
    {
      printf("Could not create socket \r\n");
      return 0;
    }else
    {
      printf("Socket created \r\n");
    }

    server.sin_addr.s_addr = inet_addr(IPAdresse);
    server.sin_family = AF_INET;
    server.sin_port = htons(TCPPort);

    if(bind(serverSocket,(struct sockaddr *)&server , sizeof(server)) < 0)  
    {
      printf("bind failed. Error \r\n");
      return 0;
    }else
    {
      printf("bind done \r\n");
    }

    listen(serverSocket, 1);        
    printf("Waiting for incoming connections... \r\n");
    size = sizeof(sockaddr_in);
    printf("size of sockaddr_in: %i \r\n", size);
    client_sock = accept(serverSocket, (struct sockaddr *)&client, &size);

   if (client_sock < 0)
   {
     printf("accept failed \r\n");
     return 0;
   }else
   {
    connected = 1;
    return 1;
   }
}

第一次工作正常时,我可以连接并可以通过套接字发送数据。当客户端关闭连接时检测到错误,我关闭套接字并再次启动服务器以等待新连接。但是,当我第二次执行 accept(..) 时,我得到了分段错误!!! 有人能帮助我吗!!!非常感谢!

【问题讨论】:

  • 算了。您的代码从里到外颠倒。如果客户消失了,重新连接到您是他的问题,而不是相反。您应该在其他地方运行一个接受循环,最终到达您的发送方法。反之亦然。
  • 在系统调用失败时使用perror;也使用strace

标签: c linux sockets server


【解决方案1】:

当客户端连接关闭时,不清楚您在做什么。我在您的代码中看不到循环,但您建议accept() 被多次调用。

没有看到其余部分或代码,我只能推测:

  • 您反复调用initServer(),因此试图一遍又一遍地重新创建相同的服务器套接字(当然,这会很糟糕),

  • 您在代码中的其他地方再次调用 accept(),很可能带有损坏的参数。

至少,您的服务器端代码应该做的是初始化一次服务器套接字,然后循环 accept(),如下所示:

  • 拨打socket()一次
  • 拨打bind()一次
  • 拨打listen()一次
  • 然后在一个循环中:
    • 调用accept(),这个调用会阻塞直到有客户端连接,然后返回一个连接的socket,
    • 用那个(连接的客户端)套接字做任何你需要做的事情
    • 继续循环

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多