了解非阻塞套接字上的EWOULDBLOCK

时间:2014-02-23 13:38:26

标签: c linux sockets websocket socket.io

我正在尝试从远程GUI应用程序访问路由器上的syslog消息。基本上路由器上的WEB服务器打开syslog文件(/ var / log / messages),读取所有日志消息并尝试通过此WEB套接字将其发送到用户请求的客户端GUI应用程序。它是一个非阻塞插座。所以我观察到当消息数量很大(发送缓冲区的大小很大)时,在调用send()调用时,它总是返回-1,错误为EWOULDBLOCK。我试图重新发出这个电话很多次,然后是相同的结果。这是否意味着TCP / IP堆栈上的发送缓冲区已满?那怎么避免呢?我甚至观察到当发送缓冲区较少时,send()成功发送数据。 感谢你提前回复?

1 个答案:

答案 0 :(得分:2)

您可以将发件人缓冲区设置为较大的大小:

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) 此外,当尝试接收时接收缓冲区为空时,会发生此错误。