Socket'ы - ошибка?

Тема в разделе "WASM.NETWORKS", создана пользователем verelex, 6 янв 2007.

  1. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    sockaddr.com
    Example Source Code
    Example programs from the book WinSock 2.0
    Covers programming with version 1.1 and version 2 of WinSock.

    Advanced Examples (Require WinSock 1.1 or 2 as noted)
    Asynchronous Server (Chapter 10)
    HTTPa.zip
    Asynchronous mode HTTP server. Works with WinSock 1.1 or 2 and any version of Windows -- 3.1 and above.
    ------------------
    Код (Text):
    1. void HandleAsyncMsg(HWND hwnd,WPARAM wParam,LPARAM lParam)
    2. {
    3.     int nErrorCode = WSAGETSELECTERROR(lParam);
    4.     switch(WSAGETSELECTEVENT(lParam))
    5.     {
    6.         case FD_ACCEPT:
    7.             OnAccept(hwnd, (SOCKET)wParam, nErrorCode);
    8.             break;
    9.         case FD_READ:
    10.             OnRead((SOCKET)wParam, nErrorCode);
    11.             break;
    12.         case FD_WRITE:
    13.             OnWrite((SOCKET)wParam, nErrorCode);
    14.             break;
    15.         case FD_CLOSE:
    16.             OnClose((SOCKET)wParam, nErrorCode);
    17.             break;
    18.     }
    19. }
    Здесь socket "соединяющегося" передается в OnAccept() через wParam,
    так же как и в примере Aquila/Hi-Tech,2002 "Туториал по написанию собственного веб-сервера".

    Код процедуры OnAccept():
    Код (Text):
    1. void OnAccept(HWND hwnd, SOCKET socket, int nErrorCode)
    2. {
    3.     SOCKADDR_IN SockAddr;
    4.     LPREQUEST   lpReq;
    5.     SOCKET      peerSocket;
    6.     int     nRet;
    7.     int     nLen;
    8.  
    9.     //
    10.     // accept the new socket descriptor
    11.     //
    12.     nLen = sizeof(SOCKADDR_IN);
    13.     peerSocket = accept(listenSocket,(LPSOCKADDR)&SockAddr,&nLen);
    14.     if (peerSocket == SOCKET_ERROR)
    15.     {
    16.         nRet = WSAGetLastError();
    17.         if (nRet != WSAEWOULDBLOCK)
    18.         {
    19.             //
    20.             // Just log the error and return
    21.             //
    22.             LogWinSockError(ghwnd, "accept() error",WSAGetLastError());
    23.             return;
    24.         }
    25.     }
    26.  
    27.     //
    28.     // Make sure we get async notices for this socket
    29.     //
    30.     nRet = WSAAsyncSelect(peerSocket,hwnd,guMsgAsy,FD_READ | FD_WRITE | FD_CLOSE);
    31.     if (peerSocket == SOCKET_ERROR)
    32.     {
    33.         nRet = WSAGetLastError();
    34.         //
    35.         // Just log the error and return
    36.         //
    37.         LogWinSockError(ghwnd, "accept() error",WSAGetLastError());
    38.         return;
    39.     }
    40.  
    41.     //
    42.     // Add the connection to the linked list
    43.     //
    44.     lpReq = AddRequest(peerSocket, LPSOCKADDR)&SockAddr, nLen);
    45.     if (lpReq == NULL)
    46.     {
    47.         // We're probably out of memory
    48.         closesocket(peerSocket);
    49.     }
    50.     LogEvent(ghwnd, "Connection accepted on socket %d from: %s",peerSocket,inet_ntoa(SockAddr.sin_addr));
    51. }
    Здесь, передаваемый wParam он же socket не используется, вместо него создается другой peerSocket (и не присваивается).
    Это ошибка или нет ???

    И еще вопросик: когда подключаешься как https:... 1-ый запрос от клиента уже кодированный, как его разобрать? RFC №?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет. При accept'е грубо говоря открывается новый сокет с клиентом, его и слежует использовать, а не тот который ожидает соединения.
    Советую покопаться с OpenSSL.
     
  3. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90