你能在select()块中多次调用sendTo()吗?

时间:2017-05-10 00:07:29

标签: c linux sockets

我正在使用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));
    }
}

我有一个我需要写的地址数组,所以我想确保我理解正确。

1 个答案:

答案 0 :(得分:1)

您可以随时调用sendto(),而不仅仅是select()告诉您套接字是可写的。当sendto()引发EAGAIN / EWOULDBLOCK时,您需要注意select()告诉您的内容。