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

Ваш аккаунт

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

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

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

Создание чата на несколько человек

5.1K
03 февраля 2010 года
Karrde
88 / / 15.10.2007
Доброго времени суток. Задача-сделать чат на несколько человек, работающий в фоновом режиме. Потоки делаю с помощью backgroundworker. Вопрос: то есть серверу нужно будет держать n-ое кол-во потоков(для обеспечения связи с n клиентов):каждый из потоков будет ждать приема сообщения от того сокета, с которым установил сообщение? или есть более простой выход?
И ещё: backgroundworker же обеспечивает синхронизацию потоков? То есть можно же в потоке будет использовать переменные этого класса, объявленные вне этого потока?
16K
03 февраля 2010 года
asmforce
186 / / 05.01.2010
Цитата: Karrde
Вопрос: то есть серверу нужно будет держать n-ое кол-во потоков(для обеспечения связи с n клиентов):каждый из потоков будет ждать приема сообщения от того сокета, с которым установил сообщение? или есть более простой выход?



Есть более простой выход - рассылка по UDP (broadcast)! Не могу сказать как это будет на .NET но на winsock просто:
1. Создаём сокет.
2. Связываем (bind) с адресом Any( 0.0.0.0 ) и требуемым портом!
// Это необходимо для приёма сообщений от всех клиентов на данном порте!
3. Запускаем бесконечный цикл, в котором принимаем сообщения на с указанного порта и выводим их в поле текста!!!
4. А сами отправляем сообщения на адрес Broadcast (255.255.255.255), но учтите - при использовании winsock требуется включить вручную возможность рассылки (по-умолчанию она отключена):
/* <CODE> */
bool isBcast = true;
setsockopt( ВАШ_СОКЕТ, SOL_SOCKET, SO_BROADCAST, (const char*) &isBcast, sizeof(isBcast) );
/* </CODE> */

Ну а на Qt ещё проще, а главное красиво - создает впечатление правильности! Если интересует могу написать!

5.1K
03 февраля 2010 года
Karrde
88 / / 15.10.2007
А listen и accept нужно использовать при этом? или просто пишем bind, и потом recv()-ждем любого сообщения?
З.Ы. А можно сообщением посылать не текст, а например, какой нить массив значений int?
16K
26 февраля 2010 года
asmforce
186 / / 05.01.2010
Цитата: Karrde
А listen и accept нужно использовать при этом? или просто пишем bind, и потом recv()-ждем любого сообщения?



listen и accept применяются при использовании TCP протокола. Тут нет.

Цитата: Karrde

З.Ы. А можно сообщением посылать не текст, а например, какой нить массив значений int?



Да.

3
26 февраля 2010 года
Green
4.8K / / 20.01.2000
Цитата: Karrde
Доброго времени суток. Задача-сделать чат на несколько человек, работающий в фоновом режиме. Потоки делаю с помощью backgroundworker. Вопрос: то есть серверу нужно будет держать n-ое кол-во потоков(для обеспечения связи с n клиентов):каждый из потоков будет ждать приема сообщения от того сокета, с которым установил сообщение? или есть более простой выход?


Есть более правильный выход - использовать порты завершения и, соотв-но, асинхронные сокеты.
Тогда не надо создавать кол-во потоков равное кол-ву соединений.

В native-коде порты завершения создаются с помощью CreateIoCompletionPort.
В .NET аналогом, наверное, будет BeginSend/EndSend, BeginReceive/EndReceive.

5.1K
02 марта 2010 года
Karrde
88 / / 15.10.2007
Спасибо. уже сделал с помощью функции select-просто жду от структуры сокетов приема любого сообщения. Вопрос теперь в другом. пробовал клиент-сервер запускать на одном компьютере(ip 127.0.0.1)-все работает, все запускается. а вот уже по сети-клиент и сервер друг друга не видят. Клиент походу в любом случае при коннекте пишет, что подключился(даже если задать несуществующий ip). Но сервер не реагирует.
З.Ы. Для соединения ведь все равно, какой порт использовать(пробовал и 80, и любые другие)?
241
03 марта 2010 года
Sanila_san
1.6K / / 07.06.2005
Немного странный у вас клиент, не должно быть такого. Для отладки не поленитесь использовать WireShark, с ним вам многое откроется. Порт всё равно какой, но понятно, что это должен быть порт, который слушает сервер. Поэтому логично назначить серверу тот порт, который ещё никем другим не слушается. Узнать, какие порты заняты, вам поможет команда netstat -a.
9.0K
01 октября 2010 года
t-34
129 / / 30.11.2007
Цитата: Karrde

З.Ы. Для соединения ведь все равно, какой порт использовать(пробовал и 80, и любые другие)?


ну, главное, чтоб клиент коннектился к тому порту, на котором сервер висит, и , чтоб порт не был занят кем-то другим.

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