[英]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.