![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Timkin |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 30.8.2005 Где: Кёльн, Германия Репутация: нет Всего: нет |
Привет всем!
Такая проблема: написал 2 программы - клиент и хост. Клиент коннектится к хосту и посылает данные через сокет. Хост разрешает соединение и получает данные. Вот коды программ: Клиент:
Хост:
То есть хост выводит на экран то, что получил от клиента. Когда я запускаю клиента в первый раз - всё ОК. Когда запускаю во второй раз, он уже ничего не передаёт (на экране хоста ничего не отображается). Когда запускаю в третий раз, он выводит сообщение, что не может соединиться с хостом... Кто-нибудь может подсказать, в чём тут проблема? |
||||
|
|||||
Plamenk |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: нет Всего: 3 |
Дело в том, что ты жестко связываешь свой TempSocket с первым клиентом:
Поэтому все остальные клиенты и не могу связаться с сервером. Для каждого клиента должен быть свой accept (По-моему, данное верно только для TCP). |
|||
|
||||
Timkin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 30.8.2005 Где: Кёльн, Германия Репутация: нет Всего: нет |
Ну я не очень силён в сокетах... Это же тот же самый клиент, просто после того, как окно с прогой закрывается, я запускаю его заново.
Насколько я понял, после того, как получены данные с клиента, первым обратившегося к серверу, порт не освобождается, и остальные клиенты вынуждены выстраиваться в очередь. ![]() Как после получения данных сбросить клиента и заняться следующим? Или если моё предположение неверно, как изменить код хоста так, чтобы он постоянно принимал данные с любого клиента? Помоги, плз!!! Это сообщение отредактировал(а) Timkin - 11.10.2005, 12:10 |
|||
|
||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 3 Всего: 19 |
Timkin
Тебе надо организовать несколько потоков общий вид серверной части такой (псевдо код)
|
|||
|
||||
Timkin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 30.8.2005 Где: Кёльн, Германия Репутация: нет Всего: нет |
Каюсь, тот код, который я написал вначале сути проблемы не отображает...
Мне нужно, чтобы сервер находился постоянно в процессе прослушивания и аксептил ВСЕ соединения клиентов. Я поставил создание сокета и старт прослушивания в бесконечный цикл:
Можно, конечно, после каждого полученного пакета делать WSACleanup() и запускать WSAStartup() заново, но тогда данные отправленные клиентами в промежутке времени между WSACleanup() и WSAStartup() теряются! Это уж не говоря о том, что теряются все строки, кроме первой с подключившегося первым клиента... Код клиента был создан для тестирования, изменение его кода проблемы не решает... Кто-нибудь знает, как решить проблему? КАК СКИНУТЬ ЧЁРТОВА КЛИЕНТА С ПОРТА, ПОСЛЕ ТОГО, КАК ОН ОТПРАВИЛ ВСЁ ЧТО ХОТЕЛ??? Это сообщение отредактировал(а) Timkin - 11.10.2005, 12:44 |
|||
|
||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 3 Всего: 19 |
комманда ACCEPT возвращает НОВЫЙ сокет, а старый у тебя остаеться (тыпросто теряеш указатель на него), поэтому и порт у тебя остаеться занят если тебе надо не паралельная обработка нескольких клиентов, а последовательная, то в моем коде просто замени CreateThread на вызов ClientProc но обрати внимание, что в после вызова accept сервенный сокет (на который ты ставиш listen) не закрываеться, а создаеться новый клиентский сокет |
|||
|
||||
Timkin |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 30.8.2005 Где: Кёльн, Германия Репутация: нет Всего: нет |
А, дошло!:)) Спасибо!
Я в строке
![]() Если кому интересно, то правильный код такой:
![]() Всем огромное спасибо!!! Это сообщение отредактировал(а) Timkin - 11.10.2005, 15:33 |
||||
|
|||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |