可以在select()块中多次调用sendTo()吗?
我正在使用Linux调用可以在select()块中多次调用sendTo()吗?,c,linux,sockets,C,Linux,Sockets,我正在使用Linux调用select()查看非阻塞UDP套接字是否可写。我正在发送到多个IP地址。我的问题是,您真的可以在select()块中执行所有sendTo(),还是需要在下一个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)
select()
查看非阻塞UDP套接字是否可写。我正在发送到多个IP地址。我的问题是,您真的可以在select()块中执行所有sendTo(),还是需要在下一个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));
}
}
我有一个需要写入的地址数组,因此我想确保我正确理解它。您可以随时调用
sendto()
,而不仅仅是当select()
告诉您套接字可写时。当sendto()
导致EAGAIN/ewoldblock时,您需要注意select()
告诉您的信息。UDP是无连接的,因此通常根本不需要测试UDP套接字的可写性。但是如果你想,当然,去做吧。您可以根据需要多次调用sendto()
,如果它最终阻塞了非阻塞套接字,它将失败并返回错误代码。你必须注意返回值!如果sendto()。如果((就绪>0)和(&…)
,则改用if。