Особенности send/receive

Тема в разделе "WASM.BEGINNERS", создана пользователем _edge, 14 янв 2017.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Перепостщу вопрос.

    возможна ли ситуация в сокетах, когда я отправлю:
    send("message",...)
    а принимающая сторона примет:
    recv(buffer,...)
    //buffer = "mess"

    концепция этих системных вызовов допускает возникновение след ситуации?

    отправитель:
    send("message")
    send("for_lesha")
    получатель:
    recv(buffer);
    //buffer = "messagefor_lesha" // склеивание
    ?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    про первый вопрос - нет, если сокеты 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.

    опять же если буфер достаточной длинны
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Если сокеты tcp, то на оба вопроса ответ "да". На старом васме разжевали, вроде, тему, что tcp - это потоковый (байтовый, а не датаграмный) протокол и гарантируется только порядок данных и их целостность, но не исходный размер.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Про целостность и порядок - это да.
    По первому вопросу - если быть точнее - если буфер мал - то данные просто не будут получены полностью. Но таки да - сообщение будет принято как урезанное. Но функция вернет ошибку - будет ошибка WSAEMSGSIZE. Я по этому и сказал про размер буфера.
    ТС же, как я понял, имел ввиду потерю части сообщения при передаче. Или тогда уж говорите полностью все условия. Какие сокеты, какой протокол, какие размеры буфера.
     
  5. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Спасибо! Для более точной инф-ции приглашу непосредственно автора вопроса.
     
  6. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вообще, насколько помню, send используется на UDP-сокетах. Для TCP-сокетов используется write(). Описание send() можно почитать, например, в мануалах:
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Данная функция не зависит от протокола. Протокол указывается при создании сокета. В линуксе хендл сокета можно юзать файловыми функциями, по этому мы в линуксе можем заюзать write. В винде нативным API (WinSock API and Win API) так не получится. В прочем это не относится к данной теме.