Привет! У меня есть несколько вопросов по Winsock, которыми уже давно интересуюсь: 1) Может ли функция send вернуть значение 0? 2) Припустим, есть у нас 2 приложения, которые общаются между собой с помощью send и recv. Пусть первое приложение отправит второму 2 пакета, размером, скажем, 1 байт и 14 байт. Как второе приложение получит эти данные? Теме же двумя пакетами, размерами в 1 и 14 байт, или же одним пакетом в 15 байт? Или может получить вообще большим количеством пакетов (тремя и более).
Насчет первого - странный вопрос, но send точно может вернуть число, меньшее числа байтов, выставленных на отправку. Второе - они могут прийти как одним пакетом, так и несколькими, прием пакетов не зависит от того, как они были посланы.
1. Code: Calling send with a len parameter of zero is permissible and will be treated by implementations as successful. In such cases, send will return zero as a valid value. For message-oriented sockets, a zero-length transport datagram is sent. 2. Тебе беспокоиться не о чем, ты приймешь данные в порядке очереди (TCP), машина всё сложит сама.
Спасибо! Еще дополнение насчет второго вопроса: если мне действительно нужно принимать данные такими же размерами, как отсылает вторая программа, что тогда делать?
если надо принимать данные по собственному типу, то реализуй свой пакетный протокол. типа маркет+размер пакета+данные. по маркер проверяй что это реально начало пакета а не левый какойто. потом считывай размер и далее читай данные этого размера. Вообще есть как не крути но даже если быстро пошлешь 2 пакета, то они склеятся уже не стороне отправителя за счет алгоритма Nagle, ты его можешь отключить, но всё равно на приемной стороне данные успеют склеится если быстро не обработаешь их. Send можен вернуть н0ль когда допустим сокет не блокирующий и полностью забит буфер для отправки данных
Если тебе надо получать сообщения именно по столько байт сколько отправлял есть несколько вариантов: -вставляй маркеры-разделители на уровне приложений(например, нулевые байты в начале и конце каждого сообщения) -переходи на UDP