Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C-select()中实现RDT会突然停止检测套接字上的输入_C_Linux_Sockets_Networking_Packet - Fatal编程技术网

在C-select()中实现RDT会突然停止检测套接字上的输入

在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=

我正在Unix C中构建两台主机之间的客户机-服务器通信应用程序。服务器和客户机都经历三个主要阶段:安装、建立和拆卸。前两个阶段成功地交换数据,但在拆卸阶段,选择功能突然停止对输入作出反应

我期望在客户端发生的是:建立阶段结束->拆卸开始->发送FIN->接收确认->发送确认->等待5秒->关闭。第三步失败了。以下是失败的代码部分:

 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