在C-select()中实现RDT会突然停止检测套接字上的输入
我正在Unix C中构建两台主机之间的客户机-服务器通信应用程序。服务器和客户机都经历三个主要阶段:安装、建立和拆卸。前两个阶段成功地交换数据,但在拆卸阶段,选择功能突然停止对输入作出反应 我期望在客户端发生的是:建立阶段结束->拆卸开始->发送FIN->接收确认->发送确认->等待5秒->关闭。第三步失败了。以下是失败的代码部分:在C-select()中实现RDT会突然停止检测套接字上的输入,c,linux,sockets,networking,packet,C,Linux,Sockets,Networking,Packet,我正在Unix C中构建两台主机之间的客户机-服务器通信应用程序。服务器和客户机都经历三个主要阶段:安装、建立和拆卸。前两个阶段成功地交换数据,但在拆卸阶段,选择功能突然停止对输入作出反应 我期望在客户端发生的是:建立阶段结束->拆卸开始->发送FIN->接收确认->发送确认->等待5秒->关闭。第三步失败了。以下是失败的代码部分: int sendFin() { do { trySend(seqNum, FIN, NULL); tv.tv_sec=1; tv.tv_usec=
int sendFin() {
do {
trySend(seqNum, FIN, NULL);
tv.tv_sec=1;
tv.tv_usec=0;
} while(select(sockfd+1,&fdSet,NULL,NULL,&tv) <= 0);
return 1;
控制台输出客户端:
Exiting recvThread
sendThread: exiting
Transmission completed
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0
其中2表示FIN标志。相同的输出重复,直到我关机
控制台输出服务器端:
recvThread: FIN Received breaking...
recvThread terminated internally
Transfer complete, shutting down
Received FIN. Teardown started. Responding with ACK + FIN
trySend: Packet made
trySend: Attempting to send 6 packet of size 32...
tryRecv: Received packet flag: 2
trySend: Packet made
trySend: Attempting to send 6 packet of size 32...
tryRecv: Received packet flag: 2
trySend: Packet made
trySend: Attempting to send 6 packet of size 32...
tryRecv: Received packet flag: 2
trySend: Packet made
trySend: Attempting to send 6 packet of size 32...
tryRecv: Received packet flag: 2
trySend: Packet made
trySend: Attempting to send 6 packet of size 32...
tryRecv: Received packet flag: 2
其中6表示确认。输出重复,直到关闭
编辑:我在waitInput()函数中封装了select()
客户端上的新控制台输出:
Exiting recvThread
sendThread: exiting
Transmission completed
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0
以此类推……当返回-1时,您不会检查错误。检查它。@user207421它返回0是否可以删除任何不需要复制错误的代码,然后发布足够的代码让我们复制问题?当您不知道函数调用的函数是做什么的时候,就很难弄清楚函数是做什么的。您不可能知道它正在返回0和您发布的代码。你为什么要这样做是另一个谜。如果这些是原始套接字,并且您正在重新实现TCP,那么您应该这样说。如果没有,你还是在重新实现TCP,这完全是浪费时间。我这么做是因为这是一个学校项目。我们正在使用UDP套接字模拟TCP。我同意这是浪费时间。我将确保更精确地检查返回值。如果为-1,则打印错误并关闭@用户207421
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0
trySend: Packet made
trySend: Attempting to send 2 packet of size 32...
waitInput, select returned: 0