2014-11-25 72 views
0

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

回答

1

目前還不清楚客戶端連接關閉時你在做什麼。我在代碼中看不到任何循環,但您建議不止一次調用accept()

在沒有看到休息或代碼,我只能推測:

  • 你一邊喊initServer(),因此試圖一遍又一遍(其中,當然,會重新創建相同的服務器套接字壞),

  • 你在你的代碼再次調用accept()別的地方,最有可能與腐敗的說法秒。

最起碼,你的服務器端代碼應該做的是一次初始化服務器插座,然後環周圍accept(),就像這樣:

  • 呼叫socket()一次
  • 呼叫bind()一次
  • 通話listen()一次
  • 然後通過循環:
    • 電話accept(),這個調用將阻塞,直到客戶端連接,然後返回連接的插座,
    • 做任何你需要的是(連接的客戶端)做插座
    • 恢復與環