hThread = CreateThread(NULL, 0, client_thread, (LPVOID)client_sock, 0, &dwThreadId);
DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = (SOCKET)nParam;
Передача ID сокета в процесс.
Вот часть кода функции int my_serv::start_server
Цитата:
HANDLE hThread;
DWORD dwThreadId;
do
{
sz_client_addr = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &sz_client_addr);
if(client_sock != SOCKET_ERROR)
{
send(client_sock, "zzz",3,0);
hThread = CreateThread(NULL, 0, client_thread, &client_sock, 0, &dwThreadId);
k++;
if(k == 2) server_command = SERVER_STOP;
}
if(server_command == SERVER_STOP)
{
this->stop_server();
break;
}
}
while (1);
return 0;
}
Вот функция потока. Кстати, она вынесена из класса, так как никак не получилось создать поток для функции внутри класса. Есть ли способ так сделать?
Цитата:
DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = (SOCKET)nParam;
send(sock, "123",3,0);
closesocket(sock);
return 0;
}
После запуска и подключения к серверу zzz выводится, а 123 - нет. Где я ошибаюсь?
Сокет жив в момент отправки второго соединения? Вобще вставь логи в места, где происходят какие то манипуляции с сокетом и потоками, а так же обработку ошибок.
Цитата: cls
Кстати, она вынесена из класса, так как никак не получилось создать поток для функции внутри класса. Есть ли способ так сделать?
Сделать поточную функцию статической в классе. В качестве параметра можно передавать указатель на реальный объект класса.
Я грешу вот на это: SOCKET sock = (SOCKET)nParam;
Цитата: cls
Я грешу вот на это: SOCKET sock = (SOCKET)nParam;
Про указатели стоит почитать.
Обрабатывал бы ошибки - сразу бы понял, что сокет невалидный в send передаешь. )
Вы можете подсказать, как правильно передать id cокета и правильно его в функции принять?
Подскажите, пожалуйста :)
Код:
или так:
Код:
hThread = CreateThread(NULL, 0, client_thread, &client_sock, 0, &dwThreadId);
DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = *(SOCKET*)nParam;
DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = *(SOCKET*)nParam;
только в этом случае надо учесть время жизни переменной client_sock
Благодарю.
А как передать указатель на string и принять его? Пробовал оба способа, вылетает с ошибкой.
Цитата: cls
Пробовал оба способа, вылетает с ошибкой.
Код пожалуйста продемонстрируйте, что за string, как создаётся и как передаётся в поточную функцию.