Olej писал(а): ↑19 сен 2022, 16:00
Переделал я ваш TCP клиент + сервер...
Существенных изменений там к вашему коду немного, больше косметика ... принципиально только следующее:
1. По возможности, не используйте
для TCP send(sockfd, ...) и recv(sockfd, ... ). А используйте write() и read(), которые используются и для
любого символьного потока...
2. И связано это с тем (и это порождает множество ошибок), что в TCP
нет никаких пакетов - TCP это поток, "труба", куда в один конец вдувается последовательность байт, а с другого сыпется последовательность байт ... и совершенно не обязательно
число байт, которое засылается с одного конца, совпадает с тем, что будет считано единичной операцией чтения с приёмного конца. TCP - сложный механизм (в отличие от UDP), где работают "под капотом" сложные механизмы: алгоритм Нэйгла, медленный старт, динамическая настройка окон передачи-приёма, контроль целостности и повторы передачи, экспоненциальный рост периодов повторной передачи...
Вы можете, например, передавать последовательно каждым send() по 100 байт, а на приёмном конце принимать recv(), иногда, и 50 байт, и 200 байт

В локальной сети это наблюдать можно очень редко, а вот через маршрутизаторы и в Интернет - запросто!
В TCP/IP нет "сообщений", сообщения в сетях TCP/IP должны быть понятием более высокого
прикладного уровня.
3. Так что в некотором смысле и мой переделанный код не 100% корректный. По хорошему
в поток TCP можно передавать "сообщения" только если:
а). фиксированной известной длины
б). самоопределённой длины ... например, передавая 1-м байтом длину следующего сообщения
в). заканчивая каждое сообщение договорным
разделителем (окончанием) - так HTTP и многие другие Интернет прикладные протоколы заканчивает сообщение "\n\n" (пустой строкой).