是的,这是可能的。读取将会阻塞(默认情况下),直到数据可用于在套接字上读取。没有必要尝试按特定顺序安排读取和写入,您的程序将等待,直到在read()
调用返回之前有东西要读取。
您的代码将导致此:
Server blocks in read()
Client write()s
Client blocks in read()
Server receives data, read() returns
Server write()s three times
Client receives data, read(1) returns
Client's read(2) is called and returns as soon as data arrive
Client's read(3) is called and returns as soon as data arrive
在一个非常快的链接有可能是服务器的write()S和读取客户端()秒发生在大致相同的时间,甚至交错,但服务器的write()将始终按顺序排列,客户端的read()将始终按顺序排列。
如果套接字是SOCK_STREAM,则数据排序被保留,例如。像你问的TCP或UNIX套接字。因此,读取(2)将始终返回写入(2)中为TCP套接字写入的数据。
如果您使用UDP套接字(SOCK_DGRAM的默认设置),您可能会发现这些消息是乱序接收的,或根本没有收到。
这不是一件坏事 - 它是八位字节(字节),流发生的情况。用户级没有“数据包”。没有'消息'长于一个字节。你似乎正在描述TCP的正常行为。 – 2014-10-10 15:51:26
@MartinJames也许我的解释并不好,我的意思是,如果从read(2)接收到write(3),这是一件坏事,因为来自wirte(3)的数据将被读取2),这是一个不起眼的行为。这可能吗? – testermaster 2014-10-10 15:53:46