2012-04-05 31 views
0

我創建一個簡單的客戶端/服務器的TCP連接。的Solaris 10的64位「水管壞了」關於TCP連接

如果服務器已經在運行,並且客戶端啓動aftewards一切工作正常。

問題如果客戶端服務器之前啓動 - >客戶端退出了 「斷管」

客戶機代碼:

 char *sUceTcpIP="127.0.0.1"; 
    int isUceTcpPort=51515; 

    struct sockaddr_in dest; 
    memset(&dest, 0, sizeof(dest)); 
    dest.sin_family = AF_INET; 
    dest.sin_addr.s_addr = inet_addr(sUceTcpIP); 
    dest.sin_port = htons(isUceTcpPort); 

    while ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) ; 
    while (connect(sockfd,(struct sockaddr *) &dest,sizeof(dest)) < 0) 
    { sleep(1); } 
    strcpy(buffer,"sometext"); 
    send(sockfd,buffer,strlen(buffer)+1,0); <---- Broken Pipe 
  • GDB回溯顯示信號從__so_send在/ 64稱爲/libc.so

  • 我試過設置NON-Blockin,Linger,Reuse,睡到客戶端/服務器,但沒有任何工作秒。

  • 我也嘗試過信號(SIGPIPE,SIG_IGN);客戶端

這看起來像一個巨大的BUG。

任何幫助/解決方法人?

回答

0

看來,我們需要刪除並重新創建套接字:

connect: 
while ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) ; 
if (connect(sockfd,(struct sockaddr *) &dest,sizeof(dest)) < 0) 
{ 
    close(sockfd); <--- close it 
    sleep(1); 
    goto connect; 
} 

無厘頭爲什麼我們需要重新創建的襪子,但它的工作。 如果有人知道更多,請隨時取消。