функ. для ожидание прихода данных.

Тема в разделе "WASM.NETWORKS", создана пользователем XshStasX, 16 сен 2009.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    iZzz32
    Это на какой же системе? Только что проверил на XP и Vista. Что тот, что тот сводится к ZwDeviceIoControlFile. И вообще, покажите мне официальную документацию, где сказано, что recv должен вызывать WSARecv. Как захотят, так и реализуют.
    Ну во-первых, как Вы правильно заметили, поддерживается он только датаграмными протоколами, во-вторых, разве UDP поддерживает этот флаг? Вернуть-то вернёт, но остаток датаграммы будет потерян.
    Ну и в-третьих, вообще неясно, каким боком MSG_PARTIAL относится к полной доставке отправляемых данных, т.к. потоковыми протоколами не поддерживается, а датаграммные и так доставляют датаграмму целиком.
     
  2. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    l_inc, мы скатились в оффтоп, и я никогда не игрался с MSG_PARTIAL, но мне что-то помнится, что если флаг поставить и дёргать WSARecv она будет этот флаг возвращать, пока все данные дейтаграммы не будут приняты.
    recv дёргает WSARecv в 98 и 2000 (ws2_32.dll).
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    iZzz32
    Ну это какбэ не повод говорить, что recv вызывает WSARecv (по меньшей мере не оговаривая, где именно). Тем более в де-факто устаревших системах.
     
  4. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    в функции recv по смещению 6C от начала идет инструкция (у меня на XP)
    71A967DB call dword ptr [eax+54h]
    в eax лежит указатель на таблицу указателей 36 функций WinSock (гуглим WinSock SPI, LSP) которые обеспечивает провайдер. не знающих сюда http://msdn.microsoft.com/en-us/library/ms741418(VS.85).aspx, читаем Network Programming for Microsoft Windows, http://ru.wikipedia.org/wiki/Microsoft_Layered_Service_Provider. Все вызовы винсока сводяться к вызовам функций WSP*** провайдера эквивалентым WSA***, которые образуют собой цепочку где каждый должен вызывать аналогичную функцию WSP*** нижестоящего поставщика.
    и все функции винсока с линуксовыми именами (connect, recv, send, getpeername и т.д) обращаются исключительно к WSP-аналогичным. У меня есть полностью написанный LSP провайдер поэтому я знаю что говорю ;)

    признаю, с этим погорячился, всегда использовал WSARecv
     
  5. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Ответ по теме был в самом начале :)

    а если тебе так угодно можешь например использовать overlapped I/O
    WSAWaitForMultipleEvents, WSAGetOverlappedResult, WSAResetEvent
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    блин, когда уже люди научатся читать msdn. вроде, всё просто, но почитать лень.