2013-12-18 4 views
1

Предположим, что мы можем различать пакеты разных TCP-соединений друг от друга, если да, то можем ли мы принять несколько TCP-соединений только на одном сокете на стороне сервера? Я знаю, что сервер связывается с сокетом, и когда прием нового соединения назначает новый сокет новому соединению. Могу ли я переопределить ACCEPT systemcall?Обработка нескольких TCP-подключений только на одном сокете на сервере

+0

Вы хотите, чтобы * один * сокет на сервере получал все данные от всех подключений? Как это делается для UDP? Тогда нет, это невозможно в TCP, поскольку это подключенный протокол, каждое соединение является отдельным объектом. –

+0

Почему? Все, что вы упомянули, уже сделано TCP, и это делается в виде отдельного сокета для каждого принятого соединения. Почему, по-вашему, вам нужно изобретать API? – EJP

+0

@ EJP. Подумайте, что я хочу обрабатывать множество соединений с минимальной задержкой, поэтому лучше обрабатывать все соединения одним сокетом вместо создания сокета для каждого из соединений, но ACCEPT systemcall возвращает отдельный сокет для каждого принятого соединения. Из-за этого я думаю, что я должен переопределить системный вызов ACCEPT! – MSH

ответ

0

Пожалуйста, предположим, что мы можем различать пакеты разных соединений TCP друг от друга

Вы не можете предположить, что это. Для приложения по TCP-соединению нет видимых «пакетов». TCP-соединение обеспечивает поток байтов. Вы не можете гарантировать, что следующее, что вы прочтете, будет означать, что заголовок сообщения сообщает вам, с какого клиента оно отправлено.

+0

Границы пакетов не видны, но addr, порт информация. Нет никакой причины, по которой сокет TCP не мог бы работать так же, как UDP-сокет, предоставляя «следующие n байтов из addr, port», где n является произвольным (в отличие от UDP). – user1055568

+0

@ user1055568 ''addr.port' information' не отображается в приложении через TCP-соединение, кроме как через' getpeername() ', что относится к сокету и, следовательно, к всему соединению. Я понятия не имею, о чем вы говорите. – EJP

+0

Я просто сказал, что именно так спроектирован API сокетов Berkley, не имеет никакого отношения к тому, определяет ли протокол TCP границы пакетов уровня приложения. – user1055568

Смежные вопросы