Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и многопоточность, Работа сокетов в отдельных потоках 
V
    Опции темы
cassej
Дата 25.7.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Как создать сокет в отдельном потоке, чтобы можно было параллельно работе приложения переодически обмениваться информацией с сервером?

Это сообщение отредактировал(а) cassej - 25.7.2008, 14:45
PM MAIL   Вверх
Lazin
Дата 25.7.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



CreateThread, так-же не помешает почитать про потокобезопасность 
PM MAIL Skype GTalk   Вверх
cassej
Дата 25.7.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Цитата(Lazin @ 25.7.2008,  12:04)
CreateThread, так-же не помешает почитать про потокобезопасность

Цитата

CreateThread, так-же не помешает почитать про потокобезопасность


Я так и создавал поток, только он не хочет в потоке инициализировать сокет

Код

hThread[i] = CreateThread( NULL, 0, ThreadProc, &dwThrdParam, 0, &dwThreadId[i] );

 а в потоке пытаюсь:
Код

if (!WSAStartup (MAKEWORD(1, 1), &wsadata)) MessageBox(hwnd, "ERROR", "!!!", MB_OK);


соответственно вылетает сообщение smile 
PM MAIL   Вверх
W4FhLF
Дата 25.7.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(cassej @  25.7.2008,  14:32 Найти цитируемый пост)
соответственно вылетает сообщение


WSAStartup в случае успеха возвращает 0. 

Цитата(http://msdn.microsoft.com/en-us/library/ms742213.aspx)

If successful, the WSAStartup function returns zero. Otherwise, it returns one of the error codes listed below.



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cassej
Дата 25.7.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Ну вообщем вся проблемма в том что коннект с сервером не проходит... без потока все нормально, в потоке он просто не связываеться с сокетом, я ошибся, не ту проверку написал, там действительно все нормально... вот:
Код

if (connect (s, (sockaddr *) &addr, sizeof (addr))==SOCKET_ERROR) MessageBox(hwnd, "ERROR", "!!!", MB_OK);


и вылетает сообщение... вообщем, если есть возможность дайте какой-нить пример, а то я весь инет перерыл...
Пишу на чистом winapi.
PM MAIL   Вверх
W4FhLF
Дата 25.7.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(cassej @  25.7.2008,  15:08 Найти цитируемый пост)
 без потока все нормально, в потоке он просто не связываеться с сокетом


Этому может быть миллиард и одна причина. В каком потоке исполняется код - разницы нет никакой. 


Цитата(cassej @  25.7.2008,  15:08 Найти цитируемый пост)
 вообщем, если есть возможность дайте какой-нить пример


Какой-нибудь? В первую очередь, где программист должен искать ответы на вопросы - это MSDN. В MSDN есть подробнейшее описание функции connect (как и всех других) с примером его использования на С.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cassej
Дата 25.7.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Так, отмена, с ситуацией разобрался, все нормально заработало, один параллельный поток создает сокет и нормально соединяется с сервером!
Вопрос другой:

Как сделать возможность создания нескольких потоков, каждый следущий вылетает с ошибкой, описанной выше?
PM MAIL   Вверх
Lazin
Дата 25.7.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



ну может у тебя сервер коннект не принимает... WSAGetLastError что говорит?
PM MAIL Skype GTalk   Вверх
cassej
Дата 25.7.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Цитата(Lazin @ 25.7.2008,  13:44)
ну может у тебя сервер коннект не принимает... WSAGetLastError что говорит?

Сначала ошибка 10022 на втором потоке, на всех последующих ошибка 10056.

Добавлено через 3 минуты и 15 секунд
10022 :
Передан недопустимый аргумент. Для передачи пакетов такая ошибка может быть связана с адресацией пакета в “черную дыру” (blackhole route).

10056 :
Для сокета, уже установившего соединение, вызвана функция connect
PM MAIL   Вверх
W4FhLF
Дата 25.7.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



cassej, ты используешь глобальные переменные? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cassej
Дата 25.7.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Цитата(W4FhLF @ 25.7.2008,  14:03)
cassej, ты используешь глобальные переменные?

да,
Код

WSADATA wsadata;
SOCKET s[100];
hostent *d_addr;
struct sockaddr_in addr;

...
int count;


А в функции потоков использую:
Код

count++;
WSAStartup (MAKEWORD(1, 1), &wsadata);
s[count] = socket (AF_INET, SOCK_STREAM, 0);


и проверка
Код

if (connect (s[count], (sockaddr *) &addr, sizeof (addr))==SOCKET_ERROR) {
    itoa(WSAGetLastError(), error, 10);
    MessageBox(hwnd, error, "!!!", MB_OK);}

PM MAIL   Вверх
W4FhLF
Дата 25.7.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



По этим отрывкам ничего толком не видно. 

WSAStartup надо вызывать один раз за всё время работы программы. Все данные касающиеся сокетов и соединений в твоём случае лучше сделать локальными. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cassej
Дата 25.7.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2008

Репутация: нет
Всего: 1



Цитата(W4FhLF @ 25.7.2008,  14:31)
WSAStartup надо вызывать один раз за всё время работы программы.

Попробывал, почти помогло. 

Теперь во всех последующих потоках ошибка 10022:
Цитата

Передан недопустимый аргумент. Для передачи пакетов такая ошибка может быть связана с адресацией пакета в “черную дыру” (blackhole route).


Добавлено через 11 минут и 56 секунд
Спасибо всем, принявшим участие в решении проблемы. smile 
Последний совет полностью все исправил и помог...
Тему закрываю наверное...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.