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): void HandleAsyncMsg(HWND hwnd,WPARAM wParam,LPARAM lParam) { int nErrorCode = WSAGETSELECTERROR(lParam); switch(WSAGETSELECTEVENT(lParam)) { case FD_ACCEPT: OnAccept(hwnd, (SOCKET)wParam, nErrorCode); break; case FD_READ: OnRead((SOCKET)wParam, nErrorCode); break; case FD_WRITE: OnWrite((SOCKET)wParam, nErrorCode); break; case FD_CLOSE: OnClose((SOCKET)wParam, nErrorCode); break; } } Здесь socket "соединяющегося" передается в OnAccept() через wParam, так же как и в примере Aquila/Hi-Tech,2002 "Туториал по написанию собственного веб-сервера". Код процедуры OnAccept(): Код (Text): void OnAccept(HWND hwnd, SOCKET socket, int nErrorCode) { SOCKADDR_IN SockAddr; LPREQUEST lpReq; SOCKET peerSocket; int nRet; int nLen; // // accept the new socket descriptor // nLen = sizeof(SOCKADDR_IN); peerSocket = accept(listenSocket,(LPSOCKADDR)&SockAddr,&nLen); if (peerSocket == SOCKET_ERROR) { nRet = WSAGetLastError(); if (nRet != WSAEWOULDBLOCK) { // // Just log the error and return // LogWinSockError(ghwnd, "accept() error",WSAGetLastError()); return; } } // // Make sure we get async notices for this socket // nRet = WSAAsyncSelect(peerSocket,hwnd,guMsgAsy,FD_READ | FD_WRITE | FD_CLOSE); if (peerSocket == SOCKET_ERROR) { nRet = WSAGetLastError(); // // Just log the error and return // LogWinSockError(ghwnd, "accept() error",WSAGetLastError()); return; } // // Add the connection to the linked list // lpReq = AddRequest(peerSocket, LPSOCKADDR)&SockAddr, nLen); if (lpReq == NULL) { // We're probably out of memory closesocket(peerSocket); } LogEvent(ghwnd, "Connection accepted on socket %d from: %s",peerSocket,inet_ntoa(SockAddr.sin_addr)); } Здесь, передаваемый wParam он же socket не используется, вместо него создается другой peerSocket (и не присваивается). Это ошибка или нет ??? И еще вопросик: когда подключаешься как https:... 1-ый запрос от клиента уже кодированный, как его разобрать? RFC №?
нет. При accept'е грубо говоря открывается новый сокет с клиентом, его и слежует использовать, а не тот который ожидает соединения. Советую покопаться с OpenSSL.