簡體   English   中英

為什么在C服務器程序中出現分段錯誤(但僅在某些時候)?

[英]Why am I getting a segmentation fault in my C server program (but only sometimes)?

現在,我正在嘗試編寫一個簡單的客戶端/服務器應用程序,以測量LAN上各種大小的TCP消息的往返時間(我正在計時客戶端)。 該程序適用於較小的數據包大小(> 1000字節),但最終出現分段錯誤:較大幅度(10KB或更大)的輸入出現11個錯誤。

int main() 
{ 
    struct sockaddr_in sin; 
    char buf[MAX_LINE]; 
    int len; 
    int s, new_s; 
    /* build address data structure */ 
    bzero((char *)& sin, sizeof( sin)); 
    sin.sin_family = AF_INET; 
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons( SERVER_PORT);
    /* setup passive open */ 
    if (( s = socket( PF_INET, SOCK_STREAM, 0)) < 0) { 
        perror("tcp program: socket"); 
        exit(1); 
    } 
    if (( bind(s, (struct sockaddr *)& sin, sizeof(sin))) < 0) { 
         perror("tcp program: bind"); 
         exit( 1); 
 } 
    listen(s, MAX_PENDING); 
    /* wait for connection, then receive and print text */
     while(1) { 
        socklen_t lent = (unsigned int)&len;
        if ((new_s = accept(s, (struct sockaddr *)& sin, &lent)) < 0) { 
            perror("tcp program: accept"); 
            exit( 1); 
        }


        while ((len = recv(new_s, buf, sizeof(buf), 0))){ 
            char msg[len];
            send( new_s, msg, len, 0); //echo message of same length as received message
        }
        close(new_s); 
      }      
}

再次,目標是測量RTT,因此我希望客戶端發送一條消息,上面的服務器接收該消息,然后發送回等效大小的消息。 我還希望服務器繼續旋轉,以便客戶端可以迭代運行,發送1KB,10KB,... 1000KB等消息。但是,此類迭代通常會導致分段錯誤。

奇怪的是,如果我將客戶端配置為運行,例如發送單個12KB消息,則服務器運行正常,然后繼續運行。 如果我等了幾秒鍾,我什至可以反復呼叫我的客戶,服務器保持運轉。 但是,如果我運行快速連續發送的單個消息,則會再次遇到段錯誤。

有任何想法嗎? 對於樣式或格式中的任何基本錯誤,我深表歉意。 這是我對“ Hello World”以外的C語言的首次真正嘗試。

謝謝!

我不知道這是否是代碼中唯一出錯的部分,但這是錯誤的:

while ((len = recv(new_s, buf, sizeof(buf), 0)))

請仔細閱讀recv()手冊頁 (添加了重點)...

這些調用返回接收到的字節數, 如果發生錯誤返回-1。 當對等方執行有序關閉時,返回值將為0。

我們知道網絡是不可靠的,並且recv()和朋友返回錯誤是相當普遍的。

此外,C語言中的可變長度數組是一個相當危險的構造,因為它們在堆棧上執行動態分配。 它們基本上是變相的alloca() ,我們知道alloca()有多危險。 所以這一點:

char msg[len]; // serious problems unless we have good bounds for len

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM