TCP-сервер: как избежать наложения сообщений - PullRequest
0 голосов
/ 17 сентября 2010

Я собираюсь написать TCP-сервер, клиент отправляет мне сообщение XML, мне интересно, произойдет ли указанное ниже условие и как этого избежать:

1) клиент отправляет <cmd ...></cmd> 2) Север занят чем-то 3) клиенты отправляют <cmd ...></cmd> 4) сервер выполняет recv () и помещает строку в буфер

Будет ли буфер заполнен <cmd ...></cmd><cmd ...></cmd> или еще хуже <cmd ...></cmd><cmd ..., если мой буфер недостаточно велик?

Что мне нужно, так это то, что стек TCP делит сообщения на те же части, что и клиенты, отправившие их.

Это выполнимо?

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Это невозможно гарантировать на уровне TCP, поскольку он знает только о потоках.

В зависимости от используемого вами синтаксического анализатора XML, вы должны иметь возможность передавать его потоку и сообщать вам об этом.когда у него есть законченный объект, второй <cmd... остается в его буфере, пока он не будет закрыт.

3 голосов
/ 17 сентября 2010

Вам нужен протокол более высокого порядка для определения границ сообщений по вашему желанию. И есть большой выбор из , включая тот, который вы изобрели сами.

0 голосов
/ 17 сентября 2010

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

Если различные команды отправляются с одного клиента, вы должны написать свой клиентский код так, чтобы он ожидал ответа на команду, прежде чем отправить следующую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...