c - unistd write() 在连续 100 次套接字写入/读取后停止写入,程序返回 3328 错误代码

标签 c sockets http unistd.h

我正在尝试测试我的网站可以处理的流量,所以我创建了一个 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/

相关文章:

c++ - 如何查找目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?

c - 当我们使用 %d 扫描字符时会发生什么?

c - 另一个进程是否接收到对 UDP 数据报的响应?

http - 使用 If-Match header 的正确行为?

php - 使用带有 curl 的网络代理

php - 为什么我的 cURL 请求在 XAMPP 中不起作用?

c - 什么是连续内存块?

c - 冒泡排序C语言

python - UDP 连接导致套接字丢失数据包?

Linux:在不执行 read()/write() 的情况下检查套接字/管道是否损坏