我是异步 I/O 的新手。我需要从 Unix SOCK_STREAM 套接字中读取大量数据。我正在使用非阻塞套接字。它可能需要不止一个 read/recv()。那部分对我来说很好。
我的疑问是——如果一次有 3-4 个客户端正在向我的服务器套接字写入大量数据,那么每个客户端都在写入 100K 数据。是否可能是我的第一次读取是从客户端 1 读取一些数据(例如 40 K),第二次读取是从客户端 2 读取数据,第三次读取是再次从客户端 1 读取剩余数据?
问候 DJ
我是异步 I/O 的新手。我需要从 Unix SOCK_STREAM 套接字中读取大量数据。我正在使用非阻塞套接字。它可能需要不止一个 read/recv()。那部分对我来说很好。
我的疑问是——如果一次有 3-4 个客户端正在向我的服务器套接字写入大量数据,那么每个客户端都在写入 100K 数据。是否可能是我的第一次读取是从客户端 1 读取一些数据(例如 40 K),第二次读取是从客户端 2 读取数据,第三次读取是再次从客户端 1 读取剩余数据?
问候 DJ
您的问题的答案很大程度上取决于您如何将 client1 定义为 clientN。具体来说,它们如何形成与服务器的连接。
SOCK_STREAM 是面向连接的。这意味着您的服务器创建一个侦听套接字,绑定到它,然后当客户端连接时,服务器接受连接并从本质上获取一个新套接字。
现在,如果 client1 到 clientN 将分别进行单独的连接,则服务器基本上将有 N 个不同的套接字,在这种情况下,您的问题的答案是否定的 - 来自不同客户端的数据不会混合,因为它们是在不同的套接字上传输的。
但是,如果您有这样一种安排,即您有一个打开连接的父客户端,并且该套接字由 clients1 共享到 n(例如在不同的线程或子进程中),那么答案是肯定的 - 写入特定套接字不是原子的,数据可以混合。
附带说明一下,如果您使用 Unix 管道而不是 unix 域套接字,即使同一管道上的不同写入器达到一定阈值(根据 POSIX,Linux 实际上至少为 512),您也将获得原子写入的好处支持65000字节)