【发布时间】:2017-12-07 12:08:43
【问题描述】:
我必须为学校编写一个简单的命令行客户端/服务器,我们的老师告诉我们,在套接字上使用 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 传输,所以搜索这个并没有产生很多结果。
以前有人遇到过这个问题吗?
【问题讨论】: