![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
BBulat |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Использую интерфейс Winsock 2. Используя пример http://www.citforum.ru/book/cook/winsock.shtml создал 2 TCP-клиента и TCP-сервер. Один клиент передает данные, сервер их принимает и тут же отдает другому клиенту, который должен их принять и вывести на экран. Оба клиента подключаются к одному серверу 127.0.0.1:666. Но на деле этого у меня не получилось. Т.е. удается от одного клиента отсылать данные на сервер и принимать обратно, отправленные сервером данные, этим же клиентом (как и в примере), но не удается принимать данные вторым, подключенным к серверу, клиентом.
часть кода сервера, отвечающая за прием и передачу данных клиента:
часть кода клиента 1, отвечающая за передачу данных на сервер и за прием ответа от сервера:
часть кода клиента 2, отвечающая за прием данных от клиента 1, переданных через сервер:
Как правильно организовать передачу от одного клиента другому? Заранее благодарен! |
||||||
|
|||||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
пока особенно не вникал, но очевидно, нужно смотреть код сервера, отвечающий за пересылку данных между клиентами
может стоит ввести набор команд серверу, по которым он работает как посредник (мост), по крайней мере, ни чего, кроме пересылки данных я здесь пока не вижу, нужно видеть хотя бы минимальную логику организации протокола, прежде чем что-либо советовать кстати, стоит ли перенести обсуждение в раздел C/C++:Сети? Добавлено через 10 минут и 21 секунду а )), вижу и код сервера, ну что ж, на сервере в момент подключения клиентов нужно организовывать либо динамический список активных клиентов, среди которых производить широковещательную рассылку или набором команд от клиента организовывать т.н. "диалог" клиентов, опиши, что ты все таки хочешь получить в итоге? что это? чат? сейчас у тебя взаимодействие клиентов вообще не описано, поэтому клиенты друг друга и не видят, это должно делаться на серверной стороне -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Не понял глубокого смысла кода
Кроме того, безотносительно того, как сервер взаимодействует с клиентами, для общения с 2мя клиентами должно быть как минимум 2 разных сокета, а он у тебя один. |
|||
|
||||
BBulat |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
ага, там по другому надо) это эхо-сервер, он принимает данные, а потом тут же их отдает.
Да, сервер создает только один сокет. Получается мне надо создать второй сокет (my_sock2) с другим портом и уже ему отправлять send(my_sock2,&buff[0],bytes_recv,0)? |
||||||
|
|||||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Кому отдает? Тому от кого принял, или кому то другому? И как он вообще подсоединяется к клиентам - UDP или TCP?
Для UDP надо явно каждый раз указывать КОМУ посылается пакет, т.к. UDP протокол соединения не устанавливает, и каждый пакет посылается по явному адресату независимо от остальных |
||||||||
|
|||||||||
alias_trinity |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 10.5.2007 Репутация: 1 Всего: 1 |
тут есть что надо
|
|||
|
||||
BBulat |
|
||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Я создал второй сокет с тем же адресом, но с другим портом и когда он подключается к серверу, я создаю второй поток, который работает с этим сокетом. Часть кода сервера, отвечающая за работу с клиентами:
В принципе работает, т.е. данные передаются от одного клиента другому, но вместе с полезными данными приходят еще и пустые строки в количестве равном размеру массива buff, т.е. 20 шт. |
||||||||||||
|
|||||||||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В строке 39 (send(my_sock,&buff[0],sizeof(buff),0);) часть sizeof(buff) заменить на bytes_recv
Кроме того - программа СОВЕРШЕННО не thread-safe, при первом же более менее частом обращении со стороны клиентов начнутся жуткие глюки |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |