Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача ID сокета в процесс.

2.2K
17 октября 2010 года
cls
24 / / 26.07.2003
Пишу прокси-сервер для своих нужд. Каждое новое соединение отправляется в отдельный поток и здесь возникают проблемы :(

Вот часть кода функции 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 - нет. Где я ошибаюсь?

240
17 октября 2010 года
aks
2.5K / / 14.07.2006
Мало информации. Выводится где? Ты каим то клиентом подключаешься и ждешь ответа после коннекта?
Сокет жив в момент отправки второго соединения? Вобще вставь логи в места, где происходят какие то манипуляции с сокетом и потоками, а так же обработку ошибок.

Цитата: cls
Кстати, она вынесена из класса, так как никак не получилось создать поток для функции внутри класса. Есть ли способ так сделать?


Сделать поточную функцию статической в классе. В качестве параметра можно передавать указатель на реальный объект класса.

2.2K
17 октября 2010 года
cls
24 / / 26.07.2003
Коннекчусь телнетом. Сразу после коннекта пишется zzz, но не пишется 123, что означает, что указатель передан не верно, либо преобразование типов выполнено неверно. Сама поточная функция запускается(там стоял MessageBox(...) для проверки этого)

Я грешу вот на это: SOCKET sock = (SOCKET)nParam;
3
17 октября 2010 года
Green
4.8K / / 20.01.2000
Цитата: cls

Я грешу вот на это: SOCKET sock = (SOCKET)nParam;


Про указатели стоит почитать.

240
17 октября 2010 года
aks
2.5K / / 14.07.2006
Кстати да, ты уж смотри что передаешь в поточную функцию и к чему это приводишь.
Обрабатывал бы ошибки - сразу бы понял, что сокет невалидный в send передаешь. )
2.2K
17 октября 2010 года
cls
24 / / 26.07.2003
Вы можете подсказать, как правильно передать id cокета и правильно его в функции принять?
2.2K
20 октября 2010 года
cls
24 / / 26.07.2003
Подскажите, пожалуйста :)
3
20 октября 2010 года
Green
4.8K / / 20.01.2000
Так
 
Код:
hThread = CreateThread(NULL, 0, client_thread, (LPVOID)client_sock, 0, &dwThreadId);

DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = (SOCKET)nParam;


или так:
 
Код:
hThread = CreateThread(NULL, 0, client_thread, &client_sock, 0, &dwThreadId);

DWORD WINAPI client_thread(void *nParam)
{
SOCKET sock = *(SOCKET*)nParam;

только в этом случае надо учесть время жизни переменной client_sock
2.2K
23 октября 2010 года
cls
24 / / 26.07.2003
Благодарю.
2.2K
29 октября 2010 года
cls
24 / / 26.07.2003
А как передать указатель на string и принять его? Пробовал оба способа, вылетает с ошибкой.
240
29 октября 2010 года
aks
2.5K / / 14.07.2006
Цитата: cls
Пробовал оба способа, вылетает с ошибкой.


Код пожалуйста продемонстрируйте, что за string, как создаётся и как передаётся в поточную функцию.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог