gpt4 book ai didi

c - select() 之后的 FD_ISSET() 未检测到接收到的数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:46 25 4
gpt4 key购买 nike

我有一个程序,我设计它可以在一堆不同的节点上运行,以根据它们从主节点上运行的进程获得的指令在它们之间传输文件。每个进程都充当发送者和接收者。

我的策略是:

//Setup a listener socket on port 63000(say) to listen to commands from the master    
//socket. This listener will only listen for commands and read these commands

/* 1) Setup a listener socket on port 63001(say) to listen to connection requests from
(NUMNODES-1) other processes on the rest of the nodes
2) Accept each of the connections from the rest of the (NUMNODES-1) nodes and fill
these conneced descriptors into an array of integers */

for(i=1;i<NUMNODES;i++){
connfd=accept(...,&node_addr,...);
index=findNodeIndex(node_addr); //To find the node number, corresp to this address
connections[index]=connfd;
}

/* Skipping all details aside, assuming i have a process running on node number 4 (out
of a total of 10 nodes, say) connections[4] will be -1, and connections[1..3, 5..10]
will hold connection descriptors to each of the other nodes, ready to read any file
that they decide to transfer */

fd_set read_set;
for(i=1;i<=NUMNODES;i++){
if(i==thisNodeNum()) //For nodenum 4, the connections[4] will be -1
continue; //So we don't want to put it into the read fd_set

FD_SET(connections[i],&read_set);
}

fd_set temp_rset;

//A select() call ready to listen to any data that comes in from any of the nodes
for(;;){
temp_rset=read_set;
select(maxfdp1,&temp_rset,NULL,NULL,NULL);

//Listening for commands from master goes here
if(FD_ISSET(commandListener,&temp_rset){
... listen to command and send file to a particular node...
... File will be sent to port 63001 on that node...
... commandLIstener listens for commands on port 63000(just a reminder)...
}

//Listening for data that has come in from the other nodes
for(i=1;i<=NUMNODES;i++){
if(FD_ISSET(connections[i],&temp_rset){
... write file to the local hard disk, byte by byte...
}
}//End of connections[1..NUMNODES] testing for data to read

}//End of infinite for loop

我的问题是,我的主人在端口号 63001 上发送命令到它喜欢的任何节点,并且命令被接收并执行。文件逐字节发送到适当的节点(例如,主命令节点 5 将文件发送到节点 9.. 节点 5 上的进程将利用连接 [9] 将文件发送到节点 9 上的进程。 .. 节点 9 上的进程将接收连接 [5] 上的数据......至少这是我想要发生的事情)

文件被发送到正确节点上的适当端口(节点 9 @ 端口 63001),但是节点 9 上的 FD_ISSET(connections[i], &temp_rset) 条件从未检测到任何发送的数据。我已经使用 tsharktcpdump 检查过,数据确实被发送到节点 9,但是 select() 调用从来没有接收到任何东西。

我做错了什么?

最佳答案

您的接受循环接受来自 NUMNODES-1 个其他节点的连接。因此,如果您有 NUMNODES 个节点都在运行此代码,这意味着它们还必须对所有其他节点执行 connect 操作。这意味着您最终会在每对节点之间建立两个连接,一个从每个方向发起。

现在,当您为您的选择循环设置 read_set 时,看起来您只是在查看您接受的连接,而不是您为之调用连接的连接。如果您还在已接受的连接(而不是已连接的连接)上发送数据,另一端的进程将不会注意到它,因为它正在等待它的已接受的连接而不是它的连接。

关于c - select() 之后的 FD_ISSET() 未检测到接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23683850/

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