| 248 | |
| 249 | |
| 250 | UINT __stdcall CGenericServer::AcceptThread(LPVOID pParam) |
| 251 | { |
| 252 | CGenericServer *pGenericServer = (CGenericServer*)pParam; |
| 253 | SOCKET s; // Main Listen Socket |
| 254 | WORD wVersionRequested; |
| 255 | WSADATA wsaData; |
| 256 | sockaddr_in saLocal; |
| 257 | WSAEVENT Handles[2]; |
| 258 | WSANETWORKEVENTS NetworkEvents; |
| 259 | sockaddr ClientAddr; |
| 260 | INT addrlen = sizeof(ClientAddr); |
| 261 | sockaddr_in sain; |
| 262 | char cAddr[50]; |
| 263 | int result; |
| 264 | |
| 265 | saLocal.sin_family = AF_INET; |
| 266 | saLocal.sin_port = htons(pGenericServer->ServerPort); |
| 267 | saLocal.sin_addr.s_addr = INADDR_ANY; |
| 268 | |
| 269 | wVersionRequested = MAKEWORD(2, 2); |
| 270 | |
| 271 | result = WSAStartup(wVersionRequested, &wsaData); |
| 272 | if(result != 0) |
| 273 | { |
| 274 | pGenericServer->LogMessage(LOGFILENAME, _T("WSAStartup(...) failure"), _T("AcceptThread"), result); |
| 275 | return THREADEXIT_SUCCESS; |
| 276 | } |
| 277 | |
| 278 | if( LOBYTE(wsaData.wVersion) != 2 || |
| 279 | HIBYTE(wsaData.wVersion) != 2) |
| 280 | { |
| 281 | pGenericServer->LogMessage(LOGFILENAME, _T("Requested Socket version not exist"), _T("AcceptThread")); |
| 282 | pGenericServer->CleanupThread(NULL, NULL, NULL); |
| 283 | return THREADEXIT_SUCCESS; |
| 284 | } |
| 285 | |
| 286 | s = WSASocket(AF_INET, SOCK_STREAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0, WSA_FLAG_OVERLAPPED); |
| 287 | if(s == INVALID_SOCKET) |
| 288 | { |
| 289 | pGenericServer->LogMessage(LOGFILENAME, _T("WSASocket(...) failure"), _T("AcceptThread"), WSAGetLastError()); |
| 290 | pGenericServer->CleanupThread(NULL, NULL, NULL); |
| 291 | return THREADEXIT_SUCCESS; |
| 292 | } |
| 293 | |
| 294 | // |
| 295 | // B I N D |
| 296 | // |
| 297 | result = ::bind(s, (struct sockaddr *)&saLocal, sizeof(saLocal)); |
| 298 | if(result == SOCKET_ERROR) |
| 299 | { |
| 300 | pGenericServer->LogMessage(LOGFILENAME, _T("bind(...) failure"), _T("AcceptThread"), WSAGetLastError()); |
| 301 | pGenericServer->CleanupThread(NULL, NULL, s); |
| 302 | return THREADEXIT_SUCCESS; |
| 303 | } |
| 304 | |
| 305 | // |
| 306 | // L I S T E N |
| 307 | // |
nothing calls this directly
no test coverage detected