gpt4 book ai didi

c++ - select() 行为的可写性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:21 26 4
gpt4 key购买 nike

我有一个 fd_set“write_set”,其中包含我想在 send(...) 调用中使用的套接字。当我在那里调用 select(maxsockfd+1, NULL, &write_set, NULL, &tv) 时,它总是返回 0(超时),尽管我还没有通过 write_set 中的套接字发送任何东西,应该可以发送数据。

这是为什么?当可以通过 write_set 中的套接字发送数据时,不应该选择立即返回吗?

谢谢!

编辑:我的代码..

// _read_set and _write_set are the master sets
fd_set read_set = _read_set;
fd_set write_set = _write_set;

// added this for testing, the socket is a member of RemoteChannelConnector.
std::list<RemoteChannelConnector*>::iterator iter;
for (iter = _acceptingConnectorList->begin(); iter != _acceptingConnectorList->end(); iter++) {

if(FD_ISSET((*iter)->getSocket(), &write_set)) {

char* buf = "a";
int ret;
if ((ret = send((*iter)->getSocket(), buf, 1, NULL)) == -1) {
std::cout << "error." << std::endl;
} else {
std::cout << "success." << std::endl;
}

}

}

struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;

int status;

if ((status = select(_maxsockfd, &read_set, &write_set, NULL, &tv)) == -1) {

// Terminate process on error.
exit(1);

} else if (status == 0) {

// Terminate process on timeout.
exit(1);

} else {
// call send/receive
}

当我使用代码运行它以测试我的套接字是否确实在 write_set 中以及是否可以通过套接字发送数据时,我得到“成功”...

最佳答案

我不相信你被允许复制构造 fd_set 对象。唯一有保证的方法是在每次调用 select 之前使用 FD_SET 完全重建集合。此外,在调用 select 之前,您正在写入要选择的套接字列表。这没有意义。

你能用 poll 代替吗?这是一个更加友好的 API。

关于c++ - select() 行为的可写性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081458/

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