|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.07.2011, 17:45 | #1 |
Пользователь
Регистрация: 03.12.2009
Сообщений: 25
|
Многопоточный чат на winsock
Всем привет. Мне необходимо написать многопоточный чат. При написании, у меня возникла проблема. Я пишу по примеру из "Самоучитель игры на WinSock2". В книге приведен пример эхо-сервера, т.е. написать на его примере сервер для чата - не должно составить особой проблемы.
Сейчас я нахожусь на стадии написания сервера. Возникла проблема с многопоточностью. В книге все просто: клиент коннектится к серверу а далее вызывается функция CreateThread с одним из параметров SexToClient, где SexToClient - функция, обслуживающая клиента. Вот код данной функции: Код:
1) в строке "my_sock=((SOCKET *) client_socket)[0];" что значит [0]? 2) что значит DWORD WINAPI? Прошу не отправлять меня читать про WinApi. Я представляю что это такое, как и для чего используется. Просто прошу пояснить, что значат эти два слова перед описанием функции. 3) Ну и самый главный вопрос, который у меня возник. Как отправлять сообщение пользователя не ему самому, а всем пользователям сразу? Я так понимаю, что надо как-то создать массив типа SOCKET, в котором будут хранится все сокеты, по которым подключены клиенты, и в цикле отправлять это сообщение всем, но как это сделать в потоке? Или может есть еще какие-нибудь варианты? Подскажите, пожалуйста, ответы на эти вопросы. |
21.07.2011, 19:33 | #2 |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
1) это массив элементов SOCKET (сишный синтаксис иногда пугает )
2) DWORD - возвращаемое значение функции WINAPI = _stdcall - cоглашение вызова функций http://ru.wikipedia.org/wiki/Соглаше...dcall.2Fwinapi 3) смотри 1) |
21.07.2011, 19:58 | #3 | ||
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2counter
Цитата:
Код:
Цитата:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
||
21.07.2011, 20:00 | #4 |
Пользователь
Регистрация: 03.12.2009
Сообщений: 25
|
То есть, как я понял, я из этого потока могу получить доступ ко всем, подключенным к серверу, клиентам? И по сути, что бы отправить сообщение всем клиентам, достаточно использовать следующий код:
Код:
По поводу пунктов 1 и 2 спасибо. |
21.07.2011, 21:27 | #5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Код:
Если у вас клиентов мало (меньше 50), можно оставить код как есть, запускайте 50 потоков, только вместо эхо-цикла крутите пустой цикл, который будет ожидать данных для посылки клиенту (ну и принимать данные от клиента тоже полезно иногда). Если клиентов много, система загнётся создавать на каждого юзвера отдельный поток. Надо думать, как одним потоком обрабатывать несколько клиентов. И да, глобальный массив клиентов совсем не помешает, не забыть только обернуть его в критическую секцию, иначе в потоках будут чудеса происходить.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
21.07.2011, 21:32 | #6 |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
На самом деле это может быть и массивом, так как не обязательно передавать его размерность. Просто при передачи, так как это С код, массив преобразуется в указатель на его первый элемент. Автор кода может быть как раз и хотел этим показать, что это некий массив.
Со мной можно встретиться на www.clipper.borda.ru
|
21.07.2011, 21:55 | #7 | ||
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2Сыроежка
Цитата:
Цитата:
пс. на самом деле я не читал код дальше строки Код:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 21.07.2011 в 22:10. |
||
21.07.2011, 22:07 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
и давно сам массив преобразуется? наверно уж имелось в виду что имя массива есть указатель на его первый элемент. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
21.07.2011, 23:09 | #9 |
Пользователь
Регистрация: 03.12.2009
Сообщений: 25
|
veniside, для каждого подключившегося клиента создается отдельный поток. Максимально допустимое число клиентов меньше 50.
pproger, скорее всего Код:
Только я все равно не понимаю, как реализовать передачу, полученной сервером, строки всем пользователям, а не только тому, от которого он получил. Объясните пожалуйста. P.S. если надо скинуть весь код - скажите, я скину. |
22.07.2011, 01:19 | #10 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 22.07.2011 в 01:22. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Чат через winsock | Jasper92 | Помощь студентам | 0 | 23.11.2010 14:48 |
Многопоточный сервер | FAiver | Работа с сетью в Delphi | 18 | 31.03.2008 08:51 |
многопоточный сервер | мандарин | Работа с сетью в Delphi | 6 | 24.04.2007 07:22 |
Многопоточный Ping | Квэнди | Работа с сетью в Delphi | 0 | 18.12.2006 15:01 |