WEB server на парадигме BSD soket'ов

Тема в разделе "WASM.NETWORKS", создана пользователем AEX CHECKER, 23 авг 2004.

Статус темы:
Закрыта.
  1. AEX CHECKER

    AEX CHECKER New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    6
    Адрес:
    КИЕВ-88
    Здравствуйте.

    Начал писать маленький сервер, используя парадигму BSD сокетов. И натолкнулся на непонятные трудности. Ниже приведенный сорс - работает(сильно накоментировано но это для себя тольно начинаю ;)).

    НО меня волнует то что количество дескрипторов у сервера прибавляется (Task Manadger показывает) при каждом обновлении страницы в броузере (я думаю это дескрипторы сокетов для send) чего не должно быть.



    Вопрос 1: правильно ли я выключаю и закрываю сокеты?

    Вопрос 2: если я правильно зарываю сокеты то в чем проблема?


    Код (Text):
    1. .486
    2. .MODEL   FLAT,STDCALL
    3. OPTION   CASEMAP:NONE
    4.  
    5. include     htaserver.inc
    6.  
    7. NEW     equ 1
    8. OLD     equ 0
    9. prsize      equ 53333
    10. rcvsize     equ 1333
    11. hstsize     equ 33
    12.  
    13.  
    14. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    15. ;   D A T A
    16. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    17. .DATA
    18. inadrlen    dd SIZEOF sockaddr_in
    19. STAT        dd OLD
    20. IndexNEW    db '<html>',13,10
    21.         db '<head>',13,10
    22.         db '<meta http-equiv="Content-Language" content="en-us]',13,10
    23.         db '<meta http-equiv="Content-Type" content="text/html; charset=windows-1252]',13,10
    24.         db '<title>NEW :: server</title>',13,10
    25.         db '</head>',13,10
    26.         db '<body>',13,10
    27.         db '<p><font color="#0000FF]<h1>NEW server</h1></font></p>',13,10
    28.         db '</body>',13,10
    29.         db '</html>',0
    30. szIndexNEW  equ $-IndexNEW
    31.  
    32. IndexOLD    db '<html>',13,10
    33.         db '<head>',13,10
    34.         db '<meta http-equiv="Content-Language" content="en-us]',13,10
    35.         db '<meta http-equiv="Content-Type" content="text/html; charset=windows-1252]',13,10
    36.         db '<title>OLD :: server</title>',13,10
    37.         db '</head>',13,10
    38.         db '<body>',13,10
    39.         db '<p><font color="#FF0000]<h1>OLD server</h1></font></p>',13,10
    40.         db '</body>',13,10
    41.         db '</html>',0
    42. szIndexOLD  equ  $-IndexOLD
    43.  
    44.  
    45. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    46. ;   D A T A ?
    47. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    48. .DATA?
    49. WSD         WSADATA     <>
    50. SH      HWND        ?
    51. SA      sockaddr_in <>
    52. inSH        HWND        ?
    53. inSA        sockaddr_in <>
    54. buf     dd      ?
    55. threadid    dd      ?
    56. StrBuf      db      1024 dup(?)
    57.  
    58.  
    59. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    60. ;   C O D E
    61. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  ::::::::::
    62. .CODE
    63.  
    64. start:                                  ; for comment position 40
    65.             mov WSD.iMaxSockets,1
    66.            
    67.             push OFFSET (WSD)           ; [out] pointer to the WSADATA structure
    68.             push 101h                   ; [in] highest version of Socket
    69.             call WSAStartup
    70.            
    71.             push IPPROTO_IP             ; [in] protocol specification
    72.             push SOCK_STREAM            ; [in] type specification
    73.             push AF_INET                ; [in] family specification
    74.             call socket
    75.            
    76.             mov SH,eax                  ; saved descriptor main_socket
    77.            
    78.             mov SA.sin_addr,NULL        ; structure sockaddr_in
    79.             mov ah,80
    80.             mov al,00
    81.             mov SA.sin_port,ax          ; http port = 80
    82.             mov SA.sin_family,AF_INET   ; family specification
    83.            
    84.             push SIZEOF SA              ; [in] length of the value
    85.             push OFFSET (SA)            ; [in] pointer to the sockaddr_in structure
    86.             push SH                     ; [in] descriptor main_socket
    87.             call bind
    88.            
    89.             push SOMAXCONN              ; [in] maximum length of the queue of pending connections
    90.             push SH                     ; [in] descriptor main_socket
    91.             call listen
    92.  
    93. accloop:
    94.             push OFFSET (inadrlen)      ; [out] pointer to length of sockaddr_in
    95.             push OFFSET (inSA)          ; [out] pointer to sockaddr_in for main_socket
    96.             push SH                     ; [in] descriptor main_socket
    97.             call accept
    98.            
    99.             cmp eax,-1
    100.             jz short accloop            ; if (!OK) goto accloop
    101.             mov inSH,eax                ; else inSH=child_socket
    102.            
    103. question_answer:
    104.  
    105.             push NULL                   ; [in] flag specifying
    106.             push 1024                   ; [in] length of buf
    107.             push OFFSET (StrBuf)        ; [out] buffer for the incoming data
    108.             push inSH                   ; [in] descriptor child_socket
    109.             call recv
    110.            
    111.             cmp STAT,0
    112.             jz pageOLD
    113.            
    114. pageNEW:
    115.             mov STAT,OLD                ; if (NEW) OLD
    116.            
    117.             push MSG_DONTROUTE          ; specifies that the data should not be subject to routing
    118.             push SIZEOF szIndexNEW      ; [in] length of the data
    119.             push OFFSET (IndexNEW)      ; [in] buffer containing the data to be transmitted
    120.             push inSH                   ; [in] descriptor child_socket
    121.             call send
    122.            
    123.             push 2                      ; [in] describes what types of operation will no longer be allowed
    124.             push inSH                   ; [in] descriptor child_socket
    125.             call shutdown
    126.            
    127.             push inSH                   ; [in] descriptor child_socket
    128.             call closesocket
    129.            
    130.             jmp accloop
    131.            
    132. pageOLD:
    133.             mov STAT,NEW                ; if (OLD) NEW
    134.            
    135.             push MSG_DONTROUTE          ; specifies that the data should not be subject to routing
    136.             push SIZEOF szIndexOLD      ; [in] length of the data
    137.             push OFFSET (IndexOLD)      ; [in] buffer containing the data to be transmitted
    138.             push inSH                   ; [in] descriptor child_socket
    139.             call send
    140.            
    141.             push inSH                   ; [in] descriptor child_socket
    142.             call closesocket
    143.            
    144.             jmp accloop
    145.  
    146. end start




    Широкова-то вышло :))}
     
  2. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    по повуду закрытия если надо зактыть сокет и чтоб потом он не висел пока ядро его не закроет делай так:



    void __fastcall set_linger(SOCKET as) {

    struct linger sLinger={1,0};

    setsockopt(as,SOL_SOCKET,SO_LINGER,(const char *)sLinger,sizeof(sLinger) );

    }

    з.ы. только где я читал что если так делать у клиента , то если несколько коннектов к серверу моут отвалиться соединения.
     
  3. AEX CHECKER

    AEX CHECKER New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    6
    Адрес:
    КИЕВ-88
    khv_test



    Посмотрел на свой фаервол И О, БОЖЕ!!! Оказывается лишние соки в режиме TIME_WAIT . Внизу вариант кода как с этим справляется апач. Он мне не нравится – зато появилась мысля как это иcправить … за день или два покажу что вышло. Заходи :))


    Код (Text):
    1. static void close_unused_listeners(void)
    2. {
    3.     listen_rec *or, *next;
    4.  
    5.     for (or = old_listeners; or; or = next) {
    6.     next = or->next;
    7.     if (!or->used)
    8.         closesocket(or->fd);
    9.     free(or);
    10.     }
    11.     old_listeners = NULL;
    12. }
     
Статус темы:
Закрыта.