После выгрузки dll - сетевой порт не освобождается долго.

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 23 май 2011.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.
    Пишу простой серверок в dll, который принимает символы и выводит из в StdOut.
    Лодер для этой dll - ка выглядит так:
    Код (Text):
    1. .code
    2. main:
    3.     ;==========================Грузим DLL первый раз==
    4.     invoke  LoadLibrary,addr szFilename; serv.dll
    5.     mov hInstance,eax
    6.     .if (!eax)
    7.         xor eax,eax
    8.         mov eax, -1
    9.         ret
    10.     .endif
    11.     invoke  GetProcAddress,hInstance,addr szLoad
    12.     mov pLoad,eax
    13.     invoke  GetProcAddress,hInstance,addr szUnLoad
    14.     mov pUnLoad,eax
    15.  
    16.  
    17.     call    dword ptr [pLoad]
    18.     pushad
    19.     invoke  wsprintf,addr TextBuf,addr template,eax
    20.     invoke  StdOut,addr TextBuf
    21.     popad
    22.  
    23.     invoke  StdIn, addr input_buffer, 1 ; Тут с dll работает клиент
    24.  
    25.     invoke  FreeLibrary,hInstance       ; Выгрузим dll
    26.     invoke  Sleep,5000
    27.     ;============================Грузим DLL второй раз==
    28.     invoke  LoadLibrary,addr szFilename
    29.     mov hInstance,eax
    30.     .if (!eax)
    31.         xor eax,eax
    32.         mov eax, -1
    33.         ret
    34.     .endif
    35.     invoke  GetProcAddress,hInstance,addr szLoad
    36.     mov pLoad,eax
    37.     invoke  GetProcAddress,hInstance,addr szUnLoad
    38.     mov pUnLoad,eax
    39.  
    40.  
    41.     call    dword ptr [pLoad] ; ----> Тут  получаем ошибку "Порт занят!"
    42.     pushad
    43.     invoke  wsprintf,addr TextBuf,addr template,eax
    44.     invoke  StdOut,addr TextBuf
    45.     popad
    46.  
    47.     invoke  Sleep,5000
    48.     ;=================================================
    49.     invoke  ExitProcess,0
    50. end main
    Результат второй попытка занять порт...
    [​IMG]

    Сам serv.dll
    Код (Text):
    1. .code
    2. ;--------------------------------------------------------------
    3. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved:DWORD
    4.     mov  eax,TRUE
    5.     ret
    6. DllEntry Endp
    7. ;--------------------------------------------------------------
    8. Load proc   pcallback:DWORD
    9.     invoke  CreateThread, 0, 0, addr Shelld, 0, 0, 0
    10.     mov hThread, eax
    11.     lea eax, szPlugLoad
    12.     ret
    13. Load endp
    14. ;--------------------------------------------------------------
    15. Unload proc
    16.     invoke  CloseHandle, hThread
    17.     invoke  Sleep, 1000
    18.     lea eax, szPlugUnLoad
    19.     ret
    20. Unload endp
    21. ;--------------------------------------------------------------
    22. ;=========================================================
    23. ShellClient proc dwSock:dword
    24. local buffer[128]:byte
    25. local flag:dword
    26.     mov flag,1
    27.     invoke  StdOut, addr szCliConnected
    28.     invoke  RtlZeroMemory,addr buffer,128
    29.     .while  flag
    30.     @@: invoke  recv, dwSock, addr buffer, sizeof buffer, 0
    31.         .if eax == SOCKET_ERROR || eax == 0
    32.             invoke  StdOut, addr szErrorRecv
    33.             jmp _exit
    34.         .endif
    35.         lea esi,buffer
    36.         cmp dword ptr [esi],'tixe';exit
    37.         je  _exit
    38.         invoke  StdOut, ADDR buffer
    39.         invoke  RtlZeroMemory,addr buffer,128
    40.         jmp @B
    41.     @@:
    42.     _exit:  mov flag,0
    43.         invoke  StdOut, addr szCliDisConnected
    44.         invoke  closesocket, dwSock
    45.     .endw
    46.     ret
    47. ShellClient endp
    48. ;=========================================================
    49. Shelld proc hInst:DWORD
    50. local SockAddrIn:sockaddr_in
    51. local ServerSocket:dword
    52. local ClientSocket:dword
    53. local WSAData:WSADATA
    54. local dwMode:dword
    55.     invoke  WSAStartup, 101h, addr WSAData
    56.     .if eax!=NULL
    57.             invoke  StdOut, addr szErrorWSAStartup
    58.             ret
    59.     .endif
    60.     invoke  socket, PF_INET, SOCK_STREAM, 0
    61.     .if eax==INVALID_SOCKET
    62.         invoke  StdOut, addr szErrorSocket
    63.         invoke  WSAGetLastError
    64.         ret
    65.     .endif
    66.     mov ServerSocket, eax
    67.  
    68.     invoke  wsprintf,addr TextBuf,addr template,PORT
    69.     invoke  StdOut,addr TextBuf
    70.  
    71.     mov SockAddrIn.sin_family, AF_INET
    72.     invoke  htons, PORT
    73.     mov SockAddrIn.sin_port, ax
    74.     mov SockAddrIn.sin_addr, INADDR_ANY
    75.     invoke  bind, ServerSocket, addr SockAddrIn, sizeof SockAddrIn
    76.  
    77.     mov dwMode, 0
    78.     invoke  ioctlsocket,ServerSocket, FIONBIO, addr dwMode
    79.     ; Ждем подключений
    80.     invoke  listen,ServerSocket, SOMAXCONN
    81.     .if eax != 0
    82.         invoke  StdOut, addr szErrorListen
    83.         invoke  WSAGetLastError
    84. int 3
    85.         ret        
    86.     .endif
    87.     invoke  StdOut, addr szConnected
    88.     .while  TRUE
    89.         invoke  accept,ServerSocket, addr SockAddrIn, 0
    90.         .if eax != INVALID_SOCKET
    91.             mov ClientSocket, eax
    92.             invoke  ShellClient, ClientSocket
    93.         .else
    94.             invoke  StdOut, addr szErrorAccept
    95.             .continue      
    96.         .endif
    97.         invoke  Sleep, 1000
    98.     .endw
    99.     invoke  shutdown,   ServerSocket, SD_BOTH
    100.     invoke  closesocket, ServerSocket
    101.     invoke  WSACleanup
    102.     ret
    103. Shelld endp
    104. ;=========================================================
    105. End DllEntry
    Вопрос что мне нужно прописать в serv.dll чтобы при выгрузке dll порт (6699) закрывался быстро?
    Спасибо.

    Все исходники в архиве ...