在Linux上接受()的分段错误

问题描述:

我在linux上的客户机/服务器程序有问题。 我写了一个服务器程序,它将数据循环发送到一个连接的客户端。 现在我想检测,如果客户端关闭到服务器的连接。当连接从客户端关闭时,我想等待接受(...)一个新的连接。 这里我的代码的关键部分:在Linux上接受()的分段错误

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

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

+0

忘记它。你的代码是内外颠倒的。如果客户消失,重新与您联系是他的问题,而不是相反。你应该有一个接受循环运行在其他地方,最终到达你的发送方法。不是相反的。 – EJP 2014-11-25 08:35:17

+1

在系统调用失败时使用'perror';也使用'strace' – 2014-11-25 08:48:02

目前还不清楚客户端连接关闭时你在做什么。我在代码中看不到任何循环,但您建议不止一次调用accept()

在没有看到休息或代码,我只能推测:

  • 你一边喊initServer(),因此试图一遍又一遍(其中,当然,会重新创建相同的服务器套接字坏),

  • 你在你的代码再次调用accept()别的地方,最有可能与腐败的说法秒。

最起码,你的服务器端代码应该做的是一次初始化服务器插座,然后环周围accept(),就像这样:

  • 呼叫socket()一次
  • 呼叫bind()一次
  • 通话listen()一次
  • 然后通过循环:
    • 电话accept(),这个调用将阻塞,直到客户端连接,然后返回连接的插座,
    • 做任何你需要的是(连接的客户端)做插座
    • 恢复与环