- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 GNU/Linux 下用 C 语言编程的多线程服务器中有这种奇怪的行为。当它正在发送数据时,最终会被 SIGPIPE 中断。因此,我设法忽略了 send() 中的信号并在每次操作后处理 errno。
因此,它有两种单独的发送方法,一种是一次发送大量数据(或至少尝试发送),另一种是发送几乎相似的数据量并将其分成小块。最后,我尝试用它来保持它发送数据。
do
{
total_bytes_sent += send(client_sd, output_buf + total_bytes_sent,
output_buf_len - total_bytes_sent, MSG_NOSIGNAL);
}
while ((total_bytes_sent < output_buf_len) && (errno != EPIPE));
这段丑陋的代码在某些情况下起作用,但并非总是如此。
我很确定这不是硬件或 ISP 问题,因为该服务器在六台欧洲服务器上运行,其中四台在德国,两台在法国。
有什么想法吗?
提前致谢。
编辑 1:是的,我注意到这段代码很糟糕(感谢 Jay)。我最初的意思是,无论客户端是否切断通信,这段代码都会给我一个 EPIPE。
编辑 2:我尝试使用单个 send() ,它随机给我同样的错误。这很奇怪,因为我无法发送大数据 block 。我尝试扩大发送缓冲区,但没有成功。
编辑 3:根据要求,这是一个更大的代码段。
data_buf_len = cur_stream->iframe_offset[cur_stream->iframe_num - 1] - first_offset;
data_buf = cur_stream->data;
output_buf = compose_reply(send_params, data_buf, data_buf_len, &output_buf_len);
/* Obviously, time measuring is *highly* unaccurate, only for
* design consistency purposes (it should return something).
* */
clock_gettime(CLOCK_REALTIME, &start_time);
total_bytes_sent = send(client_sd, output_buf, output_buf_len, MSG_NOSIGNAL);
clock_gettime(CLOCK_REALTIME, &stop_time);
spent_time = (((int64_t)stop_time.tv_sec * NANOSEC_IN_SEC) +
(int64_t)stop_time.tv_nsec) - (((int64_t)start_time.tv_sec * NANOSEC_IN_SEC) +
(int64_t)start_time.tv_nsec);
free(output_buf);
unload_video(cur_video);
if (total_bytes_sent < 0)
{
log_message(MESSAGE, __func__, IMSG_VIDEOSTOP, cur_video->path);
log_message(MESSAGE, __func__, IMSG_VIDEOSTOP, NULL);
}
/* Hope it will not serve >2147483647 seconds (~68 years) of video... */
return ((int)spent_time);
只有一个带有大缓冲区的 send() 调用。还有另一个例子,太大而无法放在这里,它将每个缓冲区分成较小的 block 并为每个 block 调用 send()。
最佳答案
正如 EJP 已经建议的那样,如果另一方关闭了套接字,则 EPIPE 出现。另外,我认为无论发送函数返回什么,您添加到“total_bytes_sent”的逻辑都是不正确的,因为在某些您仍然可以继续操作的情况下,发送可能会返回 -1(例如:在非阻塞套接字的情况下,您可能会在需要重试的地方收到错误号 EAGAIN)。
此外,如果 send 返回 0 并且 errno 不是 EPIPE,那么我猜你会不断循环。
编辑:您还可以检查 shutdown 是否正在套接字上调用。即使这样也可能导致这种行为。
关于c - send() 总是被 EPIPE 打断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598488/
我正在使用原味 Markdown ,如here所述. 我想知道是否可以在 Markdown 代码中打断长行,同时不会产生语法效果。 (在其他语言中,例如 shell 脚本和 C,\ 将用于继续下一行。
我在显示从 0-10K 运行的图时遇到了问题。目前我有从 0-100 运行的计算,它看起来很棒。 目前: 现在我想加一个 X 点,也就是 10K它看起来是这样的: 如何将它保持在 0-100 之间,然
我在更广泛的范围内问这个问题,因为我现在没有面临这个具体问题,但我想知道将来该怎么做。 如果我有一个长时间运行的 python 脚本,它应该一直在做某事(如果有帮助的话,可以是一个无限循环)。通过在终
主题:利用python画图实现坐标轴截断或打断 关键词:python, plot, matplotlib, break axes 方法一: 首先介绍一种简单快速的方法――调用包 brokena
如果运行此代码并单击 P,整个捕获阶段将执行,但冒泡阶段将按预期在 div 上停止。这段代码有什么问题? for(let elem of document.querySelectorAll('*'
那是通常的“让 img 旁边的东西垂直居中”,但我需要两行。一行就好了,但看起来像 破坏它。 Centered text 结果: IMG IMG text here IMG 但是如果我想这样做:
我在 GNU/Linux 下用 C 语言编程的多线程服务器中有这种奇怪的行为。当它正在发送数据时,最终会被 SIGPIPE 中断。因此,我设法忽略了 send() 中的信号并在每次操作后处理 errn
我有一个 ListView,它有一个方法 (public ArrayAdapter populateListView(){}) 来更新适配器。我每 500 毫秒调用一次 lv.setAdapter(p
我想将 div 堆叠在一起并在三个子元素之后打断 div。 示例 HTML: hello hello hello hello hello hello
我是一名优秀的程序员,十分优秀!