【发布时间】:2014-02-23 13:38:26
【问题描述】:
我正在尝试从远程 GUI 应用程序访问路由器上的系统日志消息。基本上,路由器上的 WEB 服务器打开 syslog 文件(/var/log/messages),读取所有日志消息并尝试根据用户请求通过此 WEB 套接字将其发送到客户端 GUI 应用程序。它是一个非阻塞套接字。所以我观察到当消息数量很大时(发送缓冲区的大小很大),在调用 send() 调用时,它总是返回 -1 并出现错误 EWOULDBLOCK。我多次尝试重新发出呼叫,结果相同。这是否意味着 TCP/IP 堆栈上的发送缓冲区已满?那么如何避免呢?我什至观察到,当发送缓冲区较少时, send() 正在成功发送数据。 感谢您提前回复?
【问题讨论】:
-
如果您的套接字是非阻塞的,您需要轮询它并响应“准备写入”事件。同时,您需要自己排队要发送的数据。
-
@Kerrek 感谢您的回复。我也在做同样的事情。我正在维护一个 fifo 并等待 FD_WRITE 事件。向用户空间发出这个事件的信号需要多少时间/条件?
-
TCP/UDP 发送缓冲区的大小是有限的。如果您尝试发送大于发送缓冲区的
send()消息,send()将始终返回 EWOULDBLOCK。也许尝试将日志消息拆分为保证不超过 TCP/UDP 发送缓冲区的块。您可以调整缓冲区的大小(在setsockopt()的限制范围内)。
标签: c linux sockets websocket socket.io