Чтение большого куска данных из сокета Unix SOCK_STREAM - PullRequest
0 голосов
/ 30 мая 2011

Я новичок в асинхронном вводе / выводе.Мне нужно прочитать большой кусок данных из сокета Unix SOCK_STREAM. Я использую неблокирующий сокет.Это может потребовать более одного чтения / recv ().Эта часть меня устраивает.

Я сомневаюсь: если за один раз 3-4 клиента записывают огромные данные в мой серверный сокет, скажем, каждый пишет 100К данных.Может ли это быть сценарий, когда мое первое чтение читает некоторые данные (скажем, 40 K) из client1, а второе чтение читает данные из клиента 2, а третье чтение снова читает оставшиеся данные из client1?

С уважением DJ

1 Ответ

1 голос
/ 30 мая 2011

Ответ на ваш вопрос очень сильно зависит от того, как вы определяете client1 to clientN.В частности, как они формируют соединение с сервером.

SOCK_STREAM ориентирован на соединение.Это означает, что ваш сервер создает прослушивающий сокет, привязывается к нему, а затем, когда клиент подключается, сервер принимает соединение и по сути получает новый сокет.

Теперь, если каждый из client1 to clientN будет выполнять отдельное соединениена сервере в основном будет N разных сокетов. В этом случае ответ на ваши вопросы - нет - данные от разных клиентов не будут смешиваться, так как они передаются по разным сокетам.

Однако, если у вас естьВ таком случае, когда у вас есть отец-клиент, который открывает соединение и этот сокет совместно используется клиентами от 1 до n (скажем, в разных потоках или дочерних процессах), тогда ответ да - записи в конкретный сокет не атомарны, а данныеМожно смешивать.

В качестве дополнительного примечания: если вы используете конвейер Unix, а не сокет домена Unix, вы получите преимущество в том, что записи являются атомарными, даже если разные пишущие в одной и той же трубе не достигают определенного порога (по крайней мере 512 в соответствии с POSIX, Linux на самом деле supпорты 65000 байт)

...