我们重写一个客户和一个服务器,以做(我觉得是iii很简单的网络通信。 木板客户与服务器连接,而服务器本应将数据送回所有其他客户。
服务器只是坐在阻挡栏<编码>电子显示<>/代码>的路段,等待交通,然后向其他客户发送数据。 这似乎只是罚款。
问题是客户。 答复如下:它有时想写字。
然而,我发现,如果我使用的话:
rv = select(fdmax + 1, &master_list, NULL, NULL, NULLiii;
我的法典将受阻,直到有新的数据读。 但有时(偶然,从另一个深处iii 我有新数据来撰写网络通信线上的数据。 因此,我希望我选择定期更新,请我检查是否有数据来撰写。
if (select(....iii != -1iii
{
if (FD_SET(sockfd, &master_listiiiiii
// handle data or disconnect
else
// look for data to write and write(iii / send(iii those.
}
我试图用以下方法确定选任以投票方式(或严格短时间iii:
// master list contains the sockfd from the getaddrinfo/socket/connect seq
struct timeval t;
memset(&t, 0, sizeof tiii;
rv = select(fdmax + 1, &master_list, NULL, NULL, &tiii;
但发现,当时客户从未获得任何新数据。
我也试图把袖珍打成非锁,例如:
fcntl(sockfd, F_SETFL, O_NONBLOCKiii;
但这并没有解决问题:
- if my client
select(iii
has nostruct timeval
, reading data works, but it never unblocks to let me look for writable data. - if my client
select(iii
has atimeval
to get it to poll, then it never signals that there are incoming data to read, and my app freezes thinking there is no network connection made (despite the fact that all other function calls have succeedediii
对于我能做什么是错了的,谁是谁? 不可能在同一张桌子上读书(我当然认为是真实的iii。
(EDIT:正确答案,以及我记住的服务器上但客户不上的东西,是在每次要求选择之前有第二版正盘,并抄录主机:
// declare and FD_ZERO read_fds:
// put sockfd in master_list
while (1iii
{
read_fds = master_list;
select(...iii;
if (FD_ISSET(read_fdsiiiiii
....
else
// sleep or otherwise don t hog cpu resources
}
iii