gpt4 book ai didi

你能在一个 select() block 中多次调用 sendTo() 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:05 24 4
gpt4 key购买 nike

我正在使用 Linux 调用 select() 来查看非阻塞 UDP 套接字是否可写。我正在发送到多个 IP 地址。我的问题是,您真的可以在一个 select() block 中执行所有 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/EWOULDBLOCK 时,您需要注意 select() 告诉您的内容。

关于你能在一个 select() block 中多次调用 sendTo() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43881656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com