2014-05-23 44 views
0

這是服務器代碼的一部分。當客戶端退出時,服務器程序,而不取芯以下行後死亡:程序在socket之後退出無核心文件::發送

n = send(s, buf+total, bytesleft, 0); 

下面是函數:

static ssize_t conn_Send(int s, u8* buf, ssize_t len) 
{ 
    ssize_t total = 0;  // how many bytes we've sent 
    ssize_t bytesleft = len; // how many we have left to send 
    ssize_t n; 

    while(total < len) 
    { 
    n = send(s, buf+total, bytesleft, 0); 
    //abort(); 
    if (n < 0) 
    { 
     return n; 
    } 
    total += n; 
    bytesleft -= n; 
    } 

    return total; 
} 

我已經在明顯的地方看了看:的/ proc/sys目錄/內核/ core_pattern設置正確,並且如果「// abort();」程序確實退出了核心文件在上面註釋掉了。

任何想法?我在智慧結束。

+1

使用調試器來弄清楚發生了什麼。我沒有看到我們可以如何幫助你,我們需要整個調用堆棧和相應的代碼。 – Mat

+0

如果n <0,你應該立即調用perror()或朋友。 – EJP

回答

1

當客戶端退出時,服務器程序死掉

n = send(s, buf+total, bytesleft, 0); 

這是典型的,當另一端關閉連接通過SIGPIPE被殺的結果。有相當多的方式來獲得解決這個問題,其中包括:

  • 您可以使用setsockoptSO_NOSIGPIPE
  • 您可以使用MSG_NOSIGNALsend標誌
  • 可以忽略SIGPIPE
+0

感謝您的快速回復。我跑過gdb並得到「程序以SIGPIPE信號終止,壞的管道,程序不再存在。」我會嘗試SO_NOSIGPIPE。 – fission

+0

@fission你也可以通過檢查返回狀態'$?'來得到一個很好的指示。 – cnicutar

相關問題