| советую почитать господина Флеонова программирование на c++ глазами хакера ну а по сути вот код от туда TCP сервер: Функции должны быть именно в таком порядке: сначала ClientThread, а затем — NetThread.
| Код | DWORD WINAPI ClientThread(LPVOID lpParam) { SOCKET sock=(SOCKET)lpParam; char szRecvBuff[1024], szSendBuff[1024]; int ret; // Запуск бесконечного цикла while(1) { // Получение данных ret = recv(sock, szRecvBuff, 1024, 0); // Проверка полученных данных if (ret == 0) break; else if (ret == SOCKET_ERROR) { MessageBox(0, "Recive data filed", "Error", 0); break; } szRecvBuff[ret] = '\0'; // Здесь можно поставить проверку принятого текста // в переменной szRecvBuffer
// Подготовка строки для отправки клиенту strcpy(szSendBuff, "Command get OK");
// Отправка содержимого переменной szSendBuff клиенту ret = send(sock, szSendBuff, sizeof(szSendBuff), 0); if (ret == SOCKET_ERROR) { break; } } return 0; }
|
| Код | DWORD WINAPI NetThread(LPVOID lpParam) { SOCKET sServerListen, sClient; struct sockaddr_in localaddr, clientaddr; HANDLE hThread; DWORD dwThreadId; int iSize;
// Создание сокета sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sServerListen == SOCKET_ERROR) { MessageBox(0, "Can't load WinSock", "Error", 0); return 0; } // Заполнение структуры localaddr типа sockaddr_in localaddr.sin_addr.s_addr = htonl(INADDR_ANY); localaddr.sin_family = AF_INET; localaddr.sin_port = htons(5050);
// Связывание адреса с переменной localaddr типа sockaddr_in if (bind(sServerListen, (struct sockaddr *)&localaddr, sizeof(localaddr)) == SOCKET_ERROR) { MessageBox(0, "Can't bind", "Error", 0); return 1; }
// Вывод сообщения об удачной операции bind MessageBox(0, "Bind OK", "Error", 0);
// Запуск прослушивания порта listen(sServerListen, 4);
// Вывод сообщения об удачном начале операции прослушивания MessageBox(0, "Listen OK", "Error", 0);
// Запуск бесконечного цикла while (1) { iSize = sizeof(clientaddr); // Прием соединения из очереди. Если его нет, // то функция будет ожидать соединения клиента sClient = accept(sServerListen, (struct sockaddr *)&clientaddr, &iSize); //Проверка корректности идентификатора клиентского сокета if (sClient == INVALID_SOCKET) { MessageBox(0, "Accept filed", "Error", 0); break; }
// Создание нового потока для работы с клиентом hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)sClient, 0, &dwThreadId); if (hThread == NULL) { MessageBox(0, "Create thread filed", "Error", 0); break; } CloseHandle(hThread); } // Закрытие сокета после работы с потоком closesocket(sServerListen); return 0; }
|
скачайте книгу там CHTML. В разделе 4.7 найдете для себя все ответы. CD прилагается |