在C中设置select()和write_fds

时间:2016-04-05 01:37:21

标签: c sockets select

我在设置Object.defineProperty(...{get: ...})select()时一定做错了。目前,当我第一次调用write_fds时,它会从缓冲区发送117个字节(全部)。然后立即再次调用,即使缓冲区中没有更多数据要发送,它也会一直呼叫sendData()

知道我在这里做错了吗?

sendData()

2 个答案:

答案 0 :(得分:2)

当网络堆栈中有空间发送更多数据时(这就是write_fds正在检查的内容),您要求select通知您。因为你只写了117个字节,所以有足够的空间,所以它会立即返回,告诉你要写更多的数据。

由于您没有更多数据要发送,您要做的是从write_fds集中删除该文件描述符。如果对write_fds的调用返回短写(无法写入所有数据),或者EWOULDBLOCK(假设您将其设置为非阻塞模式),则只需将其添加到send。 / p>

这会带来代码的主要问题 - 您在不检查返回值的情况下调用send / recv,因此您不知道实际发送或接收了多少数据。

答案 1 :(得分:0)

套接字几乎总是可写的。如果您之前已经从send()获得了EAGAIN / EWOULDBLOCK,那么您应该只在套接字上选择可写性,并且在重试并成功完成写入时应该停止这样做。