Передают / отправляют ли данные данные в идентичных блоках? - PullRequest
1 голос
/ 31 декабря 2011

От моего клиента:

send(socket, "this is a buffer", ...);
send(socket, "second buffer", ...);

На моем сервере recv гарантированно завершит один кусок с r с "this is a buffer" и начнет другой кусок с s с "second buffer'?

Ответы [ 5 ]

3 голосов
/ 31 декабря 2011

Нет, совсем нет.У вас нет контроля над тем, что происходит, когда вы получаете данные из-за всей обработки сети.Вы не можете делать какие-либо предположения о том, сколько вы получите за любой вызов recv (за исключением того, что он будет <= отправленная сумма).Вы можете получить всего один байт. </p>

0 голосов
/ 31 декабря 2011

Для UDP и других протоколов дейтаграмм границы пакетов будут сохранены так, как вы хотите.Для TCP и других потоковых протоколов нет такой удачи.

0 голосов
/ 31 декабря 2011

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

http://pubs.opengroup.org/onlinepubs/007904975/functions/recv.html

0 голосов
/ 31 декабря 2011

Я бы на это не полагался.При чтении вы можете получить их все сразу.Между ними есть много вещей - переупорядочение пакетов, задержка в сети и т. Д., Которые влияют на то, когда ваши пакеты действительно поступают на другую сторону, и может случиться так, что второй буфер может пробиться быстрее, чем первый, и будет ждать (если выИспользуете TCP, или нет, если нет) для первого прибывшего.Тогда все, что пришло, будет вам дано.Вы должны анализировать свои данные на принимающей стороне, не полагаясь на то, как они были отправлены (TCP предоставляет вам определенные гарантии заказа, UDP также не делает этого).

0 голосов
/ 31 декабря 2011

Нет, сокеты Windows (как и другие абстракции на основе TCP) являются потоковыми.Вы ищете пакетный способ использования Windows-сокетов.

Попробуйте: http://tangentsoft.net/wskfaq/examples/packetize.html

...