Это по дизайну.
TCP-поток - это канал, по которому вы можете отправлять байты между двумя конечными точками, но передача основана на потоке, а не на основе сообщений.
Если вы хотите отправлять сообщения, вам необходимо их закодировать ... например, добавив поле «размер», которое сообщит получателю, сколько байтов ожидается для тела.
Если вы отправляете 100 байт, а затем еще 100 байт, вполне возможно, что приемник вместо этого увидит 200 одновременно или даже 50 + 150 в двух разных командах чтения. Если вам нужны границы сообщений, вы должны сами поместить их в данные.
Существует более низкий уровень (датаграммы), который позволяет отправлять сообщения, однако они ограничены по размеру, и доставка не гарантируется (т. Е. Возможно, что сообщение будет потеряно, что будет дублировано или что два отправленных вами сообщения прибудут в другом порядке). Поток TCP построен поверх этой службы датаграмм и реализует всю логику, необходимую для надежной передачи данных между двумя конечными точками.
В качестве альтернативы существуют библиотеки, предназначенные для обеспечения надежного обмена сообщениями между конечными точками, например ZeroMQ.
Но как я могу сказать второй 'send()', чтобы ничего не отправлять первому 'rec()'? Ваше решение hellp меня с тем, что «текст 2» из «send() 2» не смешивается с «текстом 1», принятым в 'recv() 1'. Но потом я теряю данные 'send() 2', потому что его отправлено, и никто не ждет, чтобы он взял текст из отправленного. как я могу синхронизировать между точным отправлением и точным recv? –
@dfsfg вы не можете. Вот в чем смысл этого ответа. Эти функции не работают. –