为什么我在C服务器程序中遇到分段错误(但有时只是)?

现在,我正在尝试编写一个简单的客户端/服务器应用程序,以便测量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