我正在使用Linux调用select()
来查看非阻塞 UDP套接字是否可写。我发送到多个IP地址。我的问题是,您是否可以在select()块中实际执行所有sendTo(),或者您是否需要在下一次sendTo调用之前再次编写然后选择select?对于每一个?
示例:
struct timeval tv;
fd_set write_fds;
int ready;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&write_fds);
FD_SET((sock_fd), &write_fds);
ready = select((sock_fd) + 1, NULL, &write_fds, NULL, &tv);
// check if socket is WRITABLE
if ( ready && FD_ISSET((sock_fd), &write_fds) )
{
// Send data to ADDRESS 1
sendto(sock_fd, Msg, len, 0,
(struct sockaddr*)&C1Remoteaddr, sizeof (C1Remoteaddr));
// Send data to ADDRESS 2
sendto(sock_fd, Msg, len, 0,
(struct sockaddr*)&C2Remoteaddr, sizeof (C2Remoteaddr));
}
或者,我是否必须这样做:
ready = select((sock_fd) + 1, NULL, &write_fds, NULL, &tv);
// check if socket is WRITABLE
if ( ready && FD_ISSET((sock_fd), &write_fds) )
{
// Send data to ADDRESS 1
sendto(sock_fd, Msg, len, 0,
(struct sockaddr*)&C1Remoteaddr, sizeof (C1Remoteaddr));
// Reset FD Status?
FD_ZERO(&write_fds);
FD_SET((sock_fd), &write_fds);
ready = select((sock_fd) + 1, NULL, &write_fds, NULL, &tv);
if ( ready && FD_ISSET((sock_fd), &write_fds) )
{
// Send data to ADDRESS 2
sendto(sock_fd, Msg, len, 0,
(struct sockaddr*)&C2Remoteaddr, sizeof (C2Remoteaddr));
}
}
我有一个我需要写的地址数组,所以我想确保我理解正确。
答案 0 :(得分:1)
您可以随时调用sendto()
,而不仅仅是select()
告诉您套接字是可写的。当sendto()
引发EAGAIN / EWOULDBLOCK时,您需要注意select()
告诉您的内容。