Вопросы по Winsock2

Тема в разделе "WASM.NETWORKS", создана пользователем SnugForce, 15 янв 2006.

  1. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Код (Text):
    1.  
    2. function ThreadServer(p: pointer): integer;
    3. var
    4.   sock, s: TSocket;
    5.   Addr: TSockAddr;
    6.   AddrLen: Integer;
    7.   Cond: BOOL;
    8. begin
    9.   Addr.sin_family := AF_INET;
    10.   Addr.sin_port := htons(integer(p));
    11.   Addr.sin_addr.S_addr := 0;
    12.   sock := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, nil, 0, WSA_FLAG_OVERLAPPED);
    13.   if sock = INVALID_SOCKET then
    14.     FormatError('WSASocket');
    15.  
    16.   if bind(sock, @Addr, sizeof(Addr)) <> 0 then
    17.     FormatError('bind');
    18.  
    19.   Cond := True;
    20.   if setsockopt(sock, SOL_SOCKET, SO_CONDITIONAL_ACCEPT,
    21.              PChar(@Cond), sizeof(Cond)) <> 0 then
    22.     FormatError('setsockopt');
    23.  
    24.   if listen(sock, 65536) <> 0 then
    25.     FormatError('listen');
    26.  
    27.   while true do
    28.   begin
    29.     s := WSAAccept(sock, nil, nil, @TestClient, 0);
    30.     if s = INVALID_SOCKET then
    31.       FormatError('WSAAccept');
    32.     FormatDiag('New client');
    33.     CloseSocket(s);
    34.   end;
    35.   closesocket(sock);
    36. end;
    37.  
    38. function TestClient(lpCallerId: LPWSABUF; lpCallerData : LPWSABUF;
    39.                     lpSQOS,lpGQOS : LPQOS; lpCalleeId,lpCalleeData : LPWSABUF;
    40.                     g : GROUP; dwCallbackData : DWORD ) : Integer;
    41. begin
    42.   FormatDiag(' !!! TestClient');
    43.   Result := CF_REJECT;
    44. end;
    45.  


    setsockopt устанавливаю, что моя функция TestClient будет вызвана до того как клиенту отправиться пакет на подтверждение соединения, что в принципе и происходит, но почему при отказе в соединении клиенту происходит вторичная выборка в очередь подключений? Т.е. функция вызывается два раза, собственно и функция WSAaccept тоже.

    С одной стороны использование такого метода должно снижать нагрузку на сеть (плюс не даст многократно переподключаться "особо умным"), но с другой стороны возрастет нагрузка на приложение. Ведь с учетом, что функция будет осуществлять сложную проверку (к примеру на совпадение IP по списку из нескольких тысяч клиентов) - придется 2 раза обрабатывать клиента.

    Может я чего-то не понимаю? Поясните плиз....