从Unix SOCK_STREAM套接字读取大量数据

时间:2011-05-30 09:55:57

标签: sockets unix asyncsocket

我是异步I / O的新手。 我需要从Unix SOCK_STREAM socket读取大量数据。我正在使用非阻塞套接字。 它可能需要多个read / recv()。那部分对我没问题。

我怀疑是 - 如果在3-4时客户端正在向我的服务器套接字写入大量数据,则表示每个客户端都在写入100K数据。 它可能是我的第一次读取是从client1读取一些数据(比如说40K)而第二次读取是从客户端2读取数据而第三次读取是从client1读取剩余数据的情况吗?

此致 DJ

1 个答案:

答案 0 :(得分:1)

您的问题的答案很大程度上取决于您如何将client1定义为clientN。具体来说,它们如何形成与服务器的连接。

SOCK_STREAM是面向连接的。这意味着您的服务器创建一个侦听套接字,绑定它,然后当客户端连接服务器时接受连接并实质上获得一个新的套接字。

现在,如果client1到clientN各自进行单独连接,服务器将基本上有N个不同的套接字,在这种情况下,你的问题的答案是否定的 - 来自不同客户端的数据不会混合,因为它们是在传输的不同的插座。

但是,如果你有一种安排,你有一个父客户端打开连接,并且该套接字由clients1到n共享(比如在不同的线程或子进程中),那么答案是肯定的 - 写入特定套接字不是原子的,数据可以混合。

作为旁注,如果你使用Unix管道而不是unix域套接字,你将获得写入是原子的好处,即使同一管道上的不同编写器uo到某个阈值(根据POSIX至少512) ,Linux实际上支持65000字节)

相关问题