我正在尝试从远程 GUI 应用程序访问路由器上的系统日志消息。基本上,路由器上的 WEB 服务器打开系统日志文件(
/var/log/messages
),读取所有日志消息,并尝试根据用户请求通过此 WEB 套接字将其发送到客户端 GUI 应用程序。这是一个非阻塞套接字。所以我观察到,当消息数量很大(发送缓冲区的大小很大)时,在调用 send()
调用时,它总是返回 -1 并出现错误 EWOULDBLOCK
。我多次尝试重新发出呼叫,但结果相同。这是否意味着 TCP/IP 堆栈上的发送缓冲区已满?那么如何避免呢?我什至观察到,当发送缓冲区较小时,send()
正在成功发送数据。
感谢您提前回复。
您可以将发送缓冲区设置为大尺寸:
int sendbuf = -1; /* -1 will give a maximum allowed buffer size you can use any larger number */
rc = setsockopt(sd, SOL_SOCKET, SO_SNDBUF,(char *)&sendbuf, sizeof(sendbuf));
if(rc < 0){
printf(("Setting SO_SNDBUF error, %s",strerror(errno)));
return -1;
}
为了避免 EWOULDBLOCK(当发送缓冲区已满时会发生此错误),您应该使用 iomux(epoll、poll 或 select) 另外,当尝试接收时接收缓冲区为空时,会发生此错误。