为什么我们需要在T​​CP服务器程序中的write()之前读取()?

时间:2010-03-20 18:48:25

标签: tcp tcplistener

根据我的理解,一个简单的TCP服务器将编码如下。

socket() - bind() - listen() - accept() - read() - write()

客户将按如下方式编写。

socket() - bind()(可选) - connect() - write() - read()

请注意客户端和服务器程序之间read()和write()调用的顺序差异。

是否要求在服务器程序中的write()之前始终读取(),是否为什么?

谢谢, 纳加

4 个答案:

答案 0 :(得分:3)

这不是强制性的,但服务器在编写响应之前读取请求是有意义的。请注意,有必要经常阅读双方以防止分布式死锁:例如,如果双方都试图写入而不是读取,那么中间的缓冲区将变满,并且任何人的写入都不会继续。一个解决方案就是让一个单独的线程继续读取,如果有东西要读(这适用于客户端和服务器)。

答案 1 :(得分:2)

简单的答案是否定的。你可以自由地做任何你喜欢的事。

但是,我会很快警告说,大多数协议都是为了等待客户端发送内容而设计的。毕竟,服务器本质上提供请求,需要等待知道该请求是什么,无论是“GET /”还是“HELO”等等。因此,在将任何响应写回客户端之前,服务器读取是相当自然的。

那就是说,如果你觉得它在你做任何阅读之前将版本信息转发给客户端了。要查看效果,请使用telnet连接到您的服务器。

答案 2 :(得分:1)

您可以按任意顺序执行它们。但是,服务器通常会从read()操作生成响应,然后使用write()操作写入,因此这个顺序是有意义的。

如果您正在处理多个客户端,则应使用select之类的多路复用器在客户端准备好读取数据时通知您,因此每次尝试从客户端读取()时,服务器都不会锁定。没有发送任何东西。

答案 3 :(得分:0)

这不是一个要求,服务器程序可以先读取而不先读取套接字。但在许多情况下,服务器程序必须知道客户端想要什么 - 所以它首先调用read()。