Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Сети > Отправка/получение инфы через сокеты |
Автор: Timkin 10.10.2005, 18:21 | ||||
Привет всем! Такая проблема: написал 2 программы - клиент и хост. Клиент коннектится к хосту и посылает данные через сокет. Хост разрешает соединение и получает данные. Вот коды программ: Клиент:
Хост:
То есть хост выводит на экран то, что получил от клиента. Когда я запускаю клиента в первый раз - всё ОК. Когда запускаю во второй раз, он уже ничего не передаёт (на экране хоста ничего не отображается). Когда запускаю в третий раз, он выводит сообщение, что не может соединиться с хостом... Кто-нибудь может подсказать, в чём тут проблема? |
Автор: Plamenk 11.10.2005, 08:50 | ||
Дело в том, что ты жестко связываешь свой TempSocket с первым клиентом:
Поэтому все остальные клиенты и не могу связаться с сервером. Для каждого клиента должен быть свой accept (По-моему, данное верно только для TCP). |
Автор: Timkin 11.10.2005, 11:35 |
Ну я не очень силён в сокетах... Это же тот же самый клиент, просто после того, как окно с прогой закрывается, я запускаю его заново. Насколько я понял, после того, как получены данные с клиента, первым обратившегося к серверу, порт не освобождается, и остальные клиенты вынуждены выстраиваться в очередь. ![]() Как после получения данных сбросить клиента и заняться следующим? Или если моё предположение неверно, как изменить код хоста так, чтобы он постоянно принимал данные с любого клиента? Помоги, плз!!! |
Автор: Mad 11.10.2005, 12:23 | ||
Timkin Тебе надо организовать несколько потоков общий вид серверной части такой (псевдо код)
|
Автор: Timkin 11.10.2005, 12:41 | ||
Каюсь, тот код, который я написал вначале сути проблемы не отображает... Мне нужно, чтобы сервер находился постоянно в процессе прослушивания и аксептил ВСЕ соединения клиентов. Я поставил создание сокета и старт прослушивания в бесконечный цикл:
Можно, конечно, после каждого полученного пакета делать WSACleanup() и запускать WSAStartup() заново, но тогда данные отправленные клиентами в промежутке времени между WSACleanup() и WSAStartup() теряются! Это уж не говоря о том, что теряются все строки, кроме первой с подключившегося первым клиента... Код клиента был создан для тестирования, изменение его кода проблемы не решает... Кто-нибудь знает, как решить проблему? КАК СКИНУТЬ ЧЁРТОВА КЛИЕНТА С ПОРТА, ПОСЛЕ ТОГО, КАК ОН ОТПРАВИЛ ВСЁ ЧТО ХОТЕЛ??? |
Автор: Mad 11.10.2005, 12:50 | ||
комманда ACCEPT возвращает НОВЫЙ сокет, а старый у тебя остаеться (тыпросто теряеш указатель на него), поэтому и порт у тебя остаеться занят если тебе надо не паралельная обработка нескольких клиентов, а последовательная, то в моем коде просто замени CreateThread на вызов ClientProc но обрати внимание, что в после вызова accept сервенный сокет (на который ты ставиш listen) не закрываеться, а создаеться новый клиентский сокет |
Автор: Timkin 11.10.2005, 15:32 | ||||
А, дошло!:)) Спасибо! Я в строке
![]() Если кому интересно, то правильный код такой:
![]() Всем огромное спасибо!!! |