在linux上使用accept()进行分段错误

时间:2014-11-25 08:19:01

标签: c linux sockets server

我在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;
   }
}

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

1 个答案:

答案 0 :(得分:1)

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

在没有看到其余部分或代码的情况下,我只能推测:

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

  • 你在代码中的其他地方再次调用accept(),很可能是腐败的参数。

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

  • 致电socket()一次
  • 致电bind()一次
  • 致电listen()一次
  • 然后循环:
    • call accept(),此调用将阻塞,直到客户端连接,然后返回连接的套接字,
    • 做任何你需要做的事情(连接客户端)套接字
    • 使用循环恢复