Использывание асинхронных сокетов без создания окна?

Тема в разделе "WASM.NETWORKS", создана пользователем ganes, 10 дек 2004.

  1. ganes

    ganes New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2004
    Сообщения:
    62
    Адрес:
    Ukraine
    Можно ли зделать асинхронную работу с сукитами, не

    создавая окно? Т.е неиспользуя ресурсы и CreatWidow()..

    Так чтоб все летело в мою процедурку. Если это возможно то

    как?
     
  2. Vovane

    Vovane New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2004
    Сообщения:
    58
    Адрес:
    Afghanistan
    Код (Text):
    1. .486                  
    2.  
    3. .model flat, stdcall    
    4.  
    5. option casemap :none  
    6.  
    7.  
    8.  
    9.       include \masm32\include\windows.inc
    10.  
    11.       include \masm32\include\comctl32.inc
    12.  
    13.       include \masm32\include\masm32.inc
    14.  
    15.       include \masm32\include\user32.inc
    16.  
    17.       include \masm32\include\kernel32.inc
    18.  
    19.       include \masm32\include\msvcrt.inc
    20.  
    21.       include \masm32\include\comdlg32.inc
    22.  
    23.       include \masm32\include\shell32.inc
    24.  
    25.       include \masm32\include\ws2_32.inc
    26.  
    27.  
    28.  
    29.  
    30.  
    31.       includelib \masm32\lib\comctl32.lib
    32.  
    33.       includelib \masm32\lib\masm32.lib
    34.  
    35.       includelib \masm32\lib\user32.lib
    36.  
    37.       includelib \masm32\lib\kernel32.lib
    38.  
    39.       includelib \masm32\lib\msvcrt.lib
    40.  
    41.       includelib \masm32\lib\comdlg32.lib
    42.  
    43.       includelib \masm32\lib\shell32.lib
    44.  
    45.       includelib \masm32\lib\ws2_32.lib
    46.  
    47.    
    48.  
    49.  
    50.  
    51.       CreateSocketInformation proto :dword
    52.  
    53.       FreeSocketInformation  proto :dword
    54.  
    55.       SendData   proto :dword
    56.  
    57.  
    58.  
    59.  
    60.  
    61.  
    62.  
    63.  
    64.  
    65.  
    66.  
    67.  
    68.  
    69.  
    70.  
    71. WSABUF struct
    72.  
    73.    len dd ?
    74.  
    75.    buf dd ?
    76.  
    77. WSABUF ends
    78.  
    79.  
    80.  
    81. SOCKET_INFORMATION struct
    82.  
    83.    Buffer        db 8192 dup (?)
    84.  
    85.    DataBuf       WSABUF <>
    86.  
    87.    Socket        dd ?  
    88.  
    89.    BytesSEND     dd ?
    90.  
    91.    BytesRECV     dd ?
    92.  
    93. SOCKET_INFORMATION ends
    94.  
    95.  
    96.  
    97. WSANETWORKEVENTS struct
    98.  
    99.   lNetworkEvents   dd ?
    100.  
    101.   iErrorCode       dd [FD_MAX_EVENTS] dup (?)
    102.  
    103. WSANETWORKEVENTS ends
    104.  
    105.  
    106.  
    107.  
    108.  
    109.  
    110.  
    111.  
    112.  
    113.  
    114.  
    115.  
    116.  
    117.  
    118.  
    119.  
    120.  
    121. .data?
    122.  
    123.  
    124.  
    125.    SocketArray   dd 64  dup (?)
    126.  
    127.    EventArray    dd 64  dup (?)
    128.  
    129.    EventTotal    dd ?
    130.  
    131.  
    132.  
    133.  
    134.  
    135. .data
    136.  
    137. ddddgfgh  db  1, 0, 8, 8
    138.  
    139.           db  100 dup (0)
    140.  
    141.  
    142.  
    143. .code
    144.  
    145. start:
    146.  
    147.  
    148.  
    149.  
    150.  
    151.       call   main
    152.  
    153.       invoke ExitProcess, 0
    154.  
    155.  
    156.  
    157. ;######################################################
    158.  
    159.  
    160.  
    161. main proc
    162.  
    163.  
    164.  
    165.    LOCAL  Listen :dword
    166.  
    167.    LOCAL  Accept :dword
    168.  
    169.    LOCAL  InternetAddr : sockaddr_in
    170.  
    171.    LOCAL  Event : dword
    172.  
    173.    LOCAL  NetworkEvents : WSANETWORKEVENTS
    174.  
    175.    LOCAL  wsaData : WSADATA
    176.  
    177.    LOCAL  RetVal : dword
    178.  
    179.    LOCAL  Flags : dword
    180.  
    181.    LOCAL  RecvBytes : dword
    182.  
    183.    
    184.  
    185.  
    186.  
    187.  
    188.  
    189.    invoke WSAStartup, 202h, addr wsaData        
    190.  
    191.    invoke socket, AF_INET, SOCK_STREAM, 0
    192.  
    193.    mov    Listen, eax    
    194.  
    195.    invoke CreateSocketInformation, Listen
    196.  
    197.  
    198.  
    199.  
    200.  
    201.    mov    ecx, EventTotal  
    202.  
    203.    dec    ecx
    204.  
    205.    mov    edx, EventArray[ecx*4]
    206.  
    207.    invoke WSAEventSelect, Listen, edx, FD_ACCEPT or FD_CLOSE
    208.  
    209.    mov    InternetAddr.sin_family, AF_INET
    210.  
    211.    invoke htonl, INADDR_ANY
    212.  
    213.    mov    InternetAddr.sin_addr, eax
    214.  
    215.    invoke htons, 5000
    216.  
    217.    mov    InternetAddr.sin_port, ax  
    218.  
    219.    invoke bind, Listen, addr InternetAddr, sizeof InternetAddr  
    220.  
    221.    invoke listen, Listen, 5                    
    222.  
    223.  
    224.  
    225.    .while (TRUE)  
    226.  
    227.  
    228.  
    229.       invoke WSAWaitForMultipleEvents, EventTotal, addr EventArray, 0, -1, 0
    230.  
    231.       mov    Event, eax
    232.  
    233.       .if  eax == INVALID_SOCKET
    234.  
    235.          ret
    236.  
    237.       .endif      
    238.  
    239.       mov    ebx, Event  
    240.  
    241.       mov    esi, SocketArray[ebx*4]
    242.  
    243.       invoke WSAEnumNetworkEvents, (SOCKET_INFORMATION ptr [esi]).Socket, EventArray[ebx*4], addr NetworkEvents
    244.  
    245.       .if eax == INVALID_SOCKET              
    246.  
    247.          ret
    248.  
    249.       .endif      
    250.  
    251.       lea  edx, NetworkEvents
    252.  
    253.       mov  eax, (WSANETWORKEVENTS ptr [edx]).lNetworkEvents
    254.  
    255. ;----------------------------------------------------------
    256.  
    257.       .if  eax & FD_ACCEPT      
    258.  
    259. ;----------------------------------------------------------
    260.  
    261.          lea  ecx, (WSANETWORKEVENTS ptr [edx]).iErrorCode
    262.  
    263.          add  ecx, FD_ACCEPT_BIT
    264.  
    265.          .if  dword ptr [ecx] != 0                    
    266.  
    267.             .break
    268.  
    269.          .endif
    270.  
    271.            
    272.  
    273.          invoke accept, (SOCKET_INFORMATION ptr [esi]).Socket, 0, 0
    274.  
    275.          mov    Accept, eax
    276.  
    277.          .if eax== INVALID_SOCKET                        
    278.  
    279.             .break
    280.  
    281.          .endif
    282.  
    283.          .if EventTotal > 64
    284.  
    285.             invoke closesocket, Accept
    286.  
    287.             .break
    288.  
    289.          .endif
    290.  
    291.          invoke CreateSocketInformation, Accept                  
    292.  
    293.          mov    ecx, EventTotal  
    294.  
    295.          dec    ecx
    296.  
    297.          mov    edx, EventArray[ecx*4]
    298.  
    299.          invoke WSAEventSelect, Accept, edx, FD_READ or FD_WRITE or FD_CLOSE
    300.  
    301.          .if eax == SOCKET_ERROR                    
    302.  
    303.             ret
    304.  
    305.          .endif                    
    306.  
    307. ;------------------------------------------------------
    308.  
    309.       .elseif (NetworkEvents.lNetworkEvents & FD_READ )    
    310.  
    311. ;------------------------------------------------------                                                        
    312.  
    313.          .if (NetworkEvents.lNetworkEvents & FD_WRITE) &&  (NetworkEvents.iErrorCode[FD_WRITE_BIT] != 0)                  
    314.  
    315.             .break
    316.  
    317.          .endif                                        
    318.  
    319.          mov    ebx, Event        
    320.  
    321.          mov    esi, SocketArray[ebx*4]                  
    322.  
    323.          .if (dword ptr (SOCKET_INFORMATION ptr [esi]).BytesRECV == 0)                                  
    324.  
    325.             lea    edi, (SOCKET_INFORMATION ptr [esi]).DataBuf
    326.  
    327.             mov    (WSABUF ptr [edi]).buf, esi            
    328.  
    329.             mov    (WSABUF ptr [edi]).len, 8192
    330.  
    331.             mov    Flags, 0
    332.  
    333.             invoke WSARecv, (SOCKET_INFORMATION ptr [esi]).Socket, edi, 1, addr RecvBytes, addr Flags, NULL, NULL
    334.  
    335.             .if (eax == -1)
    336.  
    337.                 invoke WSAGetLastError
    338.  
    339.                .if (eax!= WSAEWOULDBLOCK)                                
    340.  
    341.                   invoke FreeSocketInformation, Event
    342.  
    343.                   ret
    344.  
    345.                .endif            
    346.  
    347.             .else            
    348.  
    349.               mov  eax, RecvBytes
    350.  
    351.               mov  (SOCKET_INFORMATION ptr [esi]).BytesRECV,  eax
    352.  
    353.             .endif                            
    354.  
    355.          .endif        
    356.  
    357.          mov    ebx, Event                
    358.  
    359.          mov    esi, SocketArray[ebx*4]  
    360.  
    361.          lea    edi, (SOCKET_INFORMATION ptr [esi]).DataBuf
    362.  
    363.          mov    (WSABUF ptr [edi]).buf, esi                    
    364.  
    365.          mov    (WSABUF ptr [edi]).len, ecx
    366.  
    367.          mov    (SOCKET_INFORMATION ptr [esi]).BytesRECV, 0                                                                                                      
    368.  
    369.          invoke  SendData, Event
    370.  
    371. ;-----------------------------------------------------
    372.  
    373.       .elseif (NetworkEvents.lNetworkEvents & FD_CLOSE)      
    374.  
    375. ;-----------------------------------------------------
    376.  
    377.          .if (NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)                    
    378.  
    379.             .break
    380.  
    381.          .endif        
    382.  
    383.          invoke FreeSocketInformation, Event      
    384.  
    385.       .endif  
    386.  
    387.    .endw
    388.  
    389.    ret
    390.  
    391.  
    392.  
    393. main endp
    394.  
    395.  
    396.  
    397. ;######################################################
    398.  
    399.  
    400.  
    401. CreateSocketInformation proc uses esi hSockt:dword
    402.  
    403.        
    404.  
    405.  
    406.  
    407.    invoke WSACreateEvent
    408.  
    409.    
    410.  
    411.    mov    ecx, EventTotal
    412.  
    413.    mov    EventArray[ecx*4], eax            
    414.  
    415.    .if (eax == 0)
    416.  
    417.       mov   eax, 0
    418.  
    419.       ret
    420.  
    421.    .endif
    422.  
    423.    invoke  GlobalAlloc, GPTR,  sizeof SOCKET_INFORMATION
    424.  
    425.    mov     esi, eax
    426.  
    427.    .if (eax == 0)  
    428.  
    429.       mov   eax, 0
    430.  
    431.       ret
    432.  
    433.    .endif  
    434.  
    435.    mov  eax, hSockt
    436.  
    437.    mov  (SOCKET_INFORMATION ptr [esi]).Socket,  eax
    438.  
    439.    mov  (SOCKET_INFORMATION ptr [esi]).BytesSEND,  0
    440.  
    441.    mov  (SOCKET_INFORMATION ptr [esi]).BytesRECV, 0  
    442.  
    443.      mov    ecx, EventTotal        
    444.  
    445.      mov    SocketArray[ecx*4], esi          
    446.  
    447.    inc  EventTotal                                                                                                                                                                         
    448.  
    449.    mov  eax, 1             
    450.  
    451.    ret                     
    452.  
    453.                                      
    454.  
    455. CreateSocketInformation     endp
    456.  
    457.  
    458.  
    459. ;######################################################
    460.  
    461.  
    462.  
    463. FreeSocketInformation proc  Event:dword
    464.  
    465.    
    466.  
    467.            
    468.  
    469.    mov    ebx, Event
    470.  
    471.    mov    esi, SocketArray[ebx*4]
    472.  
    473.    invoke closesocket, (SOCKET_INFORMATION ptr [esi]).Socket
    474.  
    475.    invoke GlobalFree, esi  
    476.  
    477.    invoke WSACloseEvent, EventArray[ebx*4]    
    478.  
    479.    .while ebx < EventTotal
    480.  
    481.       mov    eax, EventArray[ebx*4+1]
    482.  
    483.       mov    EventArray[ebx], eax
    484.  
    485.       mov    eax, SocketArray[ebx*4 + 1]
    486.  
    487.       mov    SocketArray[ebx*4], eax
    488.  
    489.       inc    ebx
    490.  
    491.    .endw
    492.  
    493.    dec  EventTotal
    494.  
    495.    ret
    496.  
    497.  
    498.  
    499. FreeSocketInformation endp
    500.  
    501.  
    502.  
    503. ;######################################################
    504.  
    505.  
    506.  
    507. SendData proc uses edi esi ebx pEvent:dword
    508.  
    509.  
    510.  
    511.          LOCAL  SendBytes:dword
    512.  
    513.  
    514.  
    515.          mov    ebx, pEvent                
    516.  
    517.          mov    esi, SocketArray[ebx*4]  
    518.  
    519.          invoke WSASend, (SOCKET_INFORMATION ptr [esi]).Socket, addr (SOCKET_INFORMATION ptr [esi]).DataBuf, 1, addr SendBytes, 0, NULL, NULL
    520.  
    521.          .if eax == SOCKET_ERROR
    522.  
    523.             invoke WSAGetLastError
    524.  
    525.             .if  eax != WSAEWOULDBLOCK
    526.  
    527.                invoke FreeSocketInformation, pEvent
    528.  
    529.                ret
    530.  
    531.             .endif                          
    532.  
    533.          .else            
    534.  
    535.             mov   eax, SendBytes
    536.  
    537.             mov   (SOCKET_INFORMATION ptr [esi]).BytesSEND, eax                
    538.  
    539.          .endif  
    540.  
    541.          ret
    542.  
    543.  
    544.  
    545. SendData  endp
    546.  
    547.  
    548.  
    549. ;#################################################
    550.  
    551.  
    552.  
    553. end start
     
  3. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    Добрый день
    откопал старую тему, и есть вопросы:
    1. зачем нужна эта строка:
    mov (WSABUF ptr [edi]).buf, esi
    если мы функции даем буфер скуда записать данные?!
    invoke WSARecv, (SOCKET_INFORMATION ptr [esi]).Socket, edi, 1, addr RecvBytes, addr Flags, NULL, NULL

    2. to Vovane
    взял Твой исходник откомпилировал, все нормально
    перенес в свой код у меня в этой строке дает ошибку: invalid instruction operands
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в какой строке?
    mov (WSABUF ptr [edi]).buf, esi ?
     
  5. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    да
     
  6. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    на первый вопрос понял
    там же указатель на буфер :)
    а вот как со вторым быть
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    компилятор какой? такой синтаксис (WSABUF ptr [edi]).buf поддерживается далеко не всеми ассемблерами
     
  8. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    masm32 в редакторе RadASM
    ну я же его чистый пример там же откомпилировал :)
     
  9. h0kum

    h0kum New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2003
    Сообщения:
    47
    вопрос решен
    всем спасибо за участие :)