Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 01:14   #1
Zo2m4bie
 
Регистрация: 22.12.2011
Сообщений: 6
По умолчанию Связь 2х пользователей через сервер

Подскажите новичку. Есть TCP сервер к которому присоединяются пользователи, каждый из которых работает со своим потоком. У каждого клиента есть поток ожидания связи. Один из пользователей хочет связаться с другим, он отсылает запрос на сервер, а сервер должен отослать пользователю. Проблема в том что я не могу 2рому пользователю отправить запрос на связь. Правильно ли я понимаю? В потоке который ждет звонка (у клиента) должен быть создан что то типо сервера для ожидания приема сообщения, а не просто recv который ждет сообщения?
Zo2m4bie вне форума Ответить с цитированием
Старый 25.12.2011, 02:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Вы хотите связать клиентов напрямую друг с другом, или через сервер?

Судя по названию темы, через сервер. Тогда какие проблемы? После установки связи клиента с сервером, любой из них может в любой момент послать данные на удалённую сторону, и там эти данные можно спокойно получить. Отдельное новое соединение для этого не нужно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 25.12.2011 в 02:44.
veniside вне форума Ответить с цитированием
Старый 25.12.2011, 03:00   #3
Zo2m4bie
 
Регистрация: 22.12.2011
Сообщений: 6
По умолчанию

Я хочу связаться через сервер с 2мя клиентами но заранее я не знаю с каким. Получается так, клиент, клиент-2, ... и тд, соединяется с сервером, для каждого из них выделен отдельный поток для обработки возможного сценария. Теперь допустим клиент-1 хочет связаться с клиент-2. Клиент-1 отправляет запрос на сервер что хочет связаться с клиент-2, сервер получив это должен отправить сообщение клиент-2 о том что с ним хочет связаться клиент-1. Вот тут получается проблема, у сервера не получается связаться с клиент-2 с потока в клиента-1. Так как клиенты в разных потоках я не могу получить их сокеты, а когда пытаюсь создать новый оно почему то не принимает на второй стороне, вот не пойму как решить эту проблему.
Zo2m4bie вне форума Ответить с цитированием
Старый 25.12.2011, 03:24   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> так как клиенты в разных потоках я не могу получить их сокеты

чё-то вы перемудрили. Сокет — это просто хендл, т.е. 4 байта, какие проблемы передать 4 байта из одного потока в другой?

Собственно, и передавать ничего не нужно, т.к. должен быть некий менеджер, который связывает сокет и ID клиента. В любой момент этот менеджер можно пнуть из любого потока, с просьбой послать такие-то данные такому-то клиенту. Как-то так.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.12.2011, 19:34   #5
Zo2m4bie
 
Регистрация: 22.12.2011
Сообщений: 6
По умолчанию

Так сокеты создаются локальные, у каждом потоке свой. Как получить сокет другого потока?

Код:
Выбираю из очереди подключившегося клиента:

while(client_socket = accept(mysocket, (sockaddr *) &client_addr, &client_addr_size))
	{
		nclients++;
		HOSTENT *hst;
		hst=gethostbyaddr((char *) &client_addr.sin_addr.s_addr,4,AF_INET);
		printf("+%s [%s] new conect!\n",(hst)?hst->h_name:"",inet_ntoa(client_addr.sin_addr));
		PRINTNUSERS
		DWORD thID;
		sIP df;               //структура с айпи пользователя и сокетом
		df.client_addr = client_addr;
		df.client_socket = client_socket;
		CreateThread(NULL,NULL,NewClient,&df,NULL,&thID);
	}

Сам поток:

DWORD WINAPI NewClient(LPVOID l)
{
	sIP newClient = ((sIP *)l)[0];
	SOCKET sock;
        ...
        SOCKET my_sock = newClient.client_socket;
	...
}
Zo2m4bie вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
связь пользователей между собой на сайте строгийЁЖ PHP 5 05.08.2011 11:22
связь через глобальные переменные Anna T Паскаль, Turbo Pascal, PascalABC.NET 3 18.12.2010 20:29
Получить список пользователей работающих через удаленный рабочий стол AlexandrSid Общие вопросы Delphi 2 01.06.2009 18:55
Связь с кучей dbf файлов (таблиц) через OLEDB через UNION ALL Sasha811 SQL, базы данных 0 01.01.2009 14:04
Связь через интернет Артэс Общие вопросы C/C++ 4 04.07.2008 21:54