WSASend ....

Discussion in 'WASM.NETWORKS' started by leeloo, May 11, 2008.

  1. leeloo

    leeloo New Member

    Blog Posts:
    0
    В принципе вопрос снят, но раз народ хотит ...

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

    Code (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
    Код ниже - НЕ работает

    Code (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

    Blog Posts:
    0
    Это и имелось ввиду в 17.
     
  3. leeloo

    leeloo New Member

    Blog Posts:
    0
    Дык ткните как правильно делать ...
    Мож кому и сгодится ...
     
  4. nester7

    nester7 New Member

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

    leeloo New Member

    Blog Posts:
    0
    nester7

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

    nester7 New Member

    Blog Posts:
    0
    А SendBytes где?
     
  7. leeloo

    leeloo New Member

    Blog Posts:
    0
    nester7

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

    SendBytes там-же

    .data?
    SendBytes dd ?

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

    leo Active Member

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