Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在select()块中多次调用sendTo()吗?_C_Linux_Sockets - Fatal编程技术网

可以在select()块中多次调用sendTo()吗?

可以在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)

我正在使用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), &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。