我必须为学校编写一个简单的命令行客户机/服务器,我们的老师告诉我们在套接字上使用fdopen是一个简单的方法。给出了一个协议,该协议定义了仅由EOF标记的简单请求和响应(因此不在请求本身内,而需要FIN标志)。
现在我的问题是,为了得到客户的回应,我必须关闭写作方向。
为此,我使用fclose()
忽略我正在做的细节(跳过所有的错误处理和不相关的事情)几乎是:

sdr = socket(..);
sdw=dup(sdr);
writepointer = fdopen(sdw,"w");
readpointer = fdopen(sdr,"r");
send_message(writepointer);
fclose (writepointer);

现在我希望flcose()(它成功地返回了0 btw)发送EOF,fflush(),关闭指针并关闭底层套接字描述符,从而将fin标志从客户端发送到服务器。
现在,当我单步浏览程序并同时查看tcpdump时,我看到在调用fclose()但没有FIN标志时,请求被发送(并由服务器确认)。
这当然会导致服务器看不到请求已完成,并且我的客户机在稍后尝试读取响应时变得非常无聊。
我在这里找不到很多人使用文件指针进行tcp传输,所以对它的搜索并没有产生太多结果。
以前有人遇到过这个问题吗?

最佳答案

有两种方法可以导致TCP套接字关闭,但这两种方法都不起作用。其中之一是调用shutdown。你不会那么做的。另一种方法是关闭引用连接的最后一个描述符。你不会那么做的。
做这两件事之一。
你认为这会触发关闭是不合理的。您仍然有一个可用于读取和写入连接的套接字。因此,如果触发TCP协议关闭,那将是相当令人惊讶的。

10-07 16:24
查看更多