WSASend ....

Тема в разделе "WASM.NETWORKS", создана пользователем leeloo, 11 май 2008.

  1. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    В принципе вопрос снят, но раз народ хотит ...

    Код ниже - ошибок нет

    Код (Text):
    1. send_mess   proc    lpMessage:dword
    2. LOCAL   wsa_buf:WSABUF
    3.  
    4.             mov eax,    lpMessage
    5.             mov wsa_buf.buf,    eax
    6.             invoke  lstrlen,    lpMessage
    7.             mov wsa_buf.len,    eax
    8.             invoke WSASend, Socket1, addr wsa_buf, 1, addr SendBytes, 0, NULL, NULL
    9.             .if eax == SOCKET_ERROR
    10.                 call    trans_errors_wsa
    11.             .endif
    12.     ret
    13.  
    14. send_mess endp
    Код ниже - НЕ работает

    Код (Text):
    1. .data?
    2.  
    3. wsa_buf WSABUF <?>
    4.  
    5. .code
    6.  
    7. send_mess   proc    lpMessage:dword
    8.  
    9.             mov eax,    lpMessage
    10.             mov wsa_buf.buf,    eax
    11.             invoke  lstrlen,    lpMessage
    12.             mov wsa_buf.len,    eax
    13.             invoke WSASend, Socket1, addr wsa_buf, 1, addr SendBytes, 0, NULL, NULL
    14.             .if eax == SOCKET_ERROR
    15.                 call    trans_errors_wsa
    16.             .endif
    17.     ret
    18.  
    19. send_mess endp
    Я тоже не мог понять почему такая ошибка вылетает ...
    Но через пару часов ... заработало (когда сунул в локал ...)
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Это и имелось ввиду в 17.
     
  3. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Дык ткните как правильно делать ...
    Мож кому и сгодится ...
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    wsasend() пишет в переменную sendbytes, которая поначалу у тебя была в сегменте кода,
    в который по умолчанию писать нельзя, только читать (см. совет про /section:.text,EWR).
    Правильно будет разместить ее там, где писать можно (она же _переменная_ :), соответственно,
    либо глобально, в сегменте данных, либо локально в функции.
     
  5. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    nester7

    Код (Text):
    1. .data?
    2.  
    3. wsa_buf WSABUF <?>
    4. ...
    5.  
    6. .code
    7. ...
    А это разве в 21 посте не сегмент данных?
     
  6. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    А SendBytes где?
     
  7. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    nester7

    Ну это уже флуд пошел ...

    SendBytes там-же

    .data?
    SendBytes dd ?

    Всё, тема закрыта.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    leeloo
    Если два варианта кода отличаются только переносом wsa_buf из .data? в LOCAL, то остается только грешить на выравнивание, т.к. адреса локальных переменных автоматом выравниваются на 4, а в data нет, если перед ws_buf объявлены db\dw с суммарным размером не кратным 4.
    Поробуй в .data? перед wsa_buf поставить align 4 - если не поможет, тогда останется списать все на мистику или глюки компилятора :)