2014-09-10 98 views
1

我有一個UNIX域套接字,並且能夠在服務器和客戶端之間創建和通信。問題是服務器可能意外崩潰的情況:如何處理這種情況?客戶如何知道服務器是否退出?

我的代碼中的客戶端是不同程序的一部分,它也管理各種其他任務並通過套接字將數據發送到服務器。

返回錯誤值是由我維護的Enum。此代碼是庫的一部分。

我連接到服務器,如下

int sock; 
struct sockaddr_un server; 

//Create socket 
sock = socket(AF_UNIX , SOCK_STREAM , 0); 
if (sock == -1) 
{ 
    return ERR_SOCK; 
} 

server.sun_family = AF_UNIX; 
strcpy(server.sun_path,SOCKET_PATH); 

//Connect to remote server 
if (connect(sock , (struct sockaddr *)&server , sizeof(struct sockaddr_un)) < 0) 
{ 
    return ERR_CONFAIL; 
} 

這之後我發送數據如下

ret=send(sock , message , sizeof(struct message_t) , 0); 
if(ret < 0){ 
    printf("Error while sending\n"); 
    return ERR_NOCON; 
} 

通常一切工作正常,但如果我結束我的服務器和發送數據,然後發送不不返回並且客戶端終止。

+2

SIGPIPE是什麼在殺死你的客戶端進程。 http://stackoverflow.com/a/10470017/2101267 – 2014-09-10 12:13:26

+0

如果服務器崩潰,客戶端能否繼續有用的工作? – 2014-09-10 12:44:29

+0

服務器只顯示一些信息。是的,即使服務器崩潰,客戶端也將處理非常有用的工作。我想重新啓動服務器並嘗試再次建立連接。你能提出一些建議嗎? – sandeep 2014-09-10 15:30:44

回答

2

在寫入或發送文件描述符之前,您可以使用poll(2)。這將檢查可以發送數據。更一般地說,你可以有(也許已經有)一些event loop

由於Dark Falcon評論(見this answer),你會得到SIGPIPE信號。所以請閱讀signal(7)。你可以忽略這個信號(但是他們在忽視SIGPIPE)。

也可以使用strace(1)來了解更多發生了什麼(涉及到什麼系統調用和信號)。

您可能也會讓服務器發送它的pid,並讓客戶端使用kill(2)以及一個0信號編號來測試服務器進程的存在(因爲它們都在同一臺機器上)。但我不會建議你的情況。

也許讀取Advanced Linux Programming

相關問題