我正在尝试测试我的网站可以处理的流量,所以我创建了一个 C 程序来向我的网站发送一堆连续的请求(可能不是最好的方法,但我这样做只是因为我不我真的不懂 C,不是因为我真的需要测试负载处理)。这是相关代码(如果您真的觉得需要完整的源代码,请参阅 here ):
while(1) {
sleep(1);
write(socket_id, request, strlen(request));
read(socket_id, message, 1024 * 1024);
}
其中socket_id
是已建立的socket连接的id,request
是要发送的HTTP请求,message
是返回的结果read
将被存储。这是 HTTP GET 请求:
GET / HTTP/1.1
Host: website.com
From: ...
我正在通过我网站中的 php 脚本跟踪浏览量。
无论线程休眠
多长时间,它仍然会在 100 次写入/读取后崩溃。这是为什么?
最佳答案
您的代码很糟糕,因为您从不测试 read 和 write 的返回值,因此您仍然可以在关闭服务器端后尝试访问套接字,但这不应该导致崩溃。
但在查看您的 github 代码后,我注意到您在 2 个不同的 c 文件中包含的 .h 文件中定义 struct sockaddr_in servaddr;
。确实有些编译器可以允许它,但它不符合 C,因为它不遵守单一定义规则。事实上,您在一个程序中定义了两次相同的变量会导致未定义的行为。
正确的方法是在包含文件中声明变量为外部变量:extern struct sockaddr_in servaddr;
,并且只定义在一个c文件。在您当前的源代码中,您甚至可以只在 connector.c 文件中声明它。
但总的来说,全局变量是一场噩梦,因为它们可能会在意想不到的时间从意想不到的地方被更改,并导致使用错误的值。至少 servaddr
应该在 connector.c 中声明为静态。
关于c - unistd write() 在连续 100 次套接字写入/读取后停止写入,程序返回 3328 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317284/