Несколько вопросов по Winsock

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Chrome~, 17 Oct 2010.

  1. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Привет!
    У меня есть несколько вопросов по Winsock, которыми уже давно интересуюсь:

    1) Может ли функция send вернуть значение 0?
    2) Припустим, есть у нас 2 приложения, которые общаются между собой с помощью send и recv. Пусть первое приложение отправит второму 2 пакета, размером, скажем, 1 байт и 14 байт. Как второе приложение получит эти данные? Теме же двумя пакетами, размерами в 1 и 14 байт, или же одним пакетом в 15 байт? Или может получить вообще большим количеством пакетов (тремя и более).
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Насчет первого - странный вопрос, но send точно может вернуть число, меньшее числа байтов, выставленных на отправку.
    Второе - они могут прийти как одним пакетом, так и несколькими, прием пакетов не зависит от того, как они были посланы.
     
    1 person likes this.
  3. Spy2ex

    Spy2ex Elder - Старейшина

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    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 people like this.
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Спасибо!
    Еще дополнение насчет второго вопроса: если мне действительно нужно принимать данные такими же размерами, как отсылает вторая программа, что тогда делать?
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    В сумме получешь все что слал,recv вернет число принятых им байт.
     
    1 person likes this.
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    если надо принимать данные по собственному типу, то реализуй свой пакетный протокол.
    типа маркет+размер пакета+данные.
    по маркер проверяй что это реально начало пакета а не левый какойто. потом считывай размер и далее читай данные этого размера.

    Вообще есть как не крути но даже если быстро пошлешь 2 пакета, то они склеятся уже не стороне отправителя за счет алгоритма Nagle, ты его можешь отключить, но всё равно на приемной стороне данные успеют склеится если быстро не обработаешь их.
    Send можен вернуть н0ль когда допустим сокет не блокирующий и полностью забит буфер для отправки данных
     
    1 person likes this.
  7. devton

    devton Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    3,371
    Likes Received:
    5,124
    Reputations:
    48
    Если тебе надо получать сообщения именно по столько байт сколько отправлял есть несколько вариантов:
    -вставляй маркеры-разделители на уровне приложений(например, нулевые байты в начале и конце каждого сообщения)
    -переходи на UDP
     
    1 person likes this.
  8. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Всем спасибо за ответы, все становится намного более понятнее.
    Пока что вопросов нет.