Перепостщу вопрос. возможна ли ситуация в сокетах, когда я отправлю: send("message",...) а принимающая сторона примет: recv(buffer,...) //buffer = "mess" концепция этих системных вызовов допускает возникновение след ситуации? отправитель: send("message") send("for_lesha") получатель: recv(buffer); //buffer = "messagefor_lesha" // склеивание ?
про первый вопрос - нет, если сокеты TCP и принимающий буфер имеет место для полного сообщения по второму вопросу - может быть такая ситуация ибо : The successful completion of a send function does not indicate that the data was successfully delivered and received to the recipient. This function only indicates the data was successfully sent. опять же если буфер достаточной длинны
Если сокеты tcp, то на оба вопроса ответ "да". На старом васме разжевали, вроде, тему, что tcp - это потоковый (байтовый, а не датаграмный) протокол и гарантируется только порядок данных и их целостность, но не исходный размер.
Про целостность и порядок - это да. По первому вопросу - если быть точнее - если буфер мал - то данные просто не будут получены полностью. Но таки да - сообщение будет принято как урезанное. Но функция вернет ошибку - будет ошибка WSAEMSGSIZE. Я по этому и сказал про размер буфера. ТС же, как я понял, имел ввиду потерю части сообщения при передаче. Или тогда уж говорите полностью все условия. Какие сокеты, какой протокол, какие размеры буфера.
Вообще, насколько помню, send используется на UDP-сокетах. Для TCP-сокетов используется write(). Описание send() можно почитать, например, в мануалах:
Данная функция не зависит от протокола. Протокол указывается при создании сокета. В линуксе хендл сокета можно юзать файловыми функциями, по этому мы в линуксе можем заюзать write. В винде нативным API (WinSock API and Win API) так не получится. В прочем это не относится к данной теме.