gpt4 book ai didi

Linux 上的 C : using fclose() on Filepointers made from Socket descriptors

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:14 26 4
gpt4 key购买 nike

我必须为学校编写一个简单的命令行客户端/服务器,我们的老师告诉我们在套接字上使用 fdopen 是最简单的方法。给出的协议(protocol)定义了仅由 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 协议(protocol)关闭,那将是相当令人惊讶的。

关于Linux 上的 C : using fclose() on Filepointers made from Socket descriptors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47694829/

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