Вопросы по сокетам., Чтение/Запись в сокет.. |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы по сокетам., Чтение/Запись в сокет.. |
blondinka |
24.4.2009, 15:01
Сообщение
#11
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Здравствуйте, у меня вопрос по сокету...Может знает кто.
Можно как-нибудь средствами Qt определить: после того,как мне выслан сигнал connected(), сделал ли сервер accept() или запрос на подключение стоит в очереди...Т.е. если к серверу уже есть подключение, то второе разрывается...Сделать это нужно в клиенте. |
|
|
ViGOur |
24.4.2009, 15:26
Сообщение
#12
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Можно, написав класс менеджер подключений, в котором будут хранится все твои подключения.
|
|
|
blondinka |
24.4.2009, 15:31
Сообщение
#13
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Если я запустила ону копию программы-клиента на одном компе,а другую на другом? Они оба соединились,но более поздний висит в очереди на подключение...Толку от этого класса не будет.
P.S. Следом возник вопрос - QAbstractSocket::ListeningState - чтоэ то за состояние? Сообщение отредактировал blondinka - 24.4.2009, 15:35 |
|
|
ViGOur |
24.4.2009, 15:38
Сообщение
#14
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Почему не будет?
Все подключения будут проходит через него, в нем будет хранится информация о них. Он сможет узнать есть подключение или нет и в случае чего сбросить лишнее подключение или поставить в очередь. з.ы. опиши подробней задачу... |
|
|
blondinka |
24.4.2009, 15:51
Сообщение
#15
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Есть tcp-сервер, который находтся на линуксовой машине. И есть виндоус клиент, в котром вообще возможно только 1 подключение(ну как в аське - вводишь логин,пароль, соединяешься и попадаешь в программу). И если я запущу программу-клиента, соединюсь, то в моем классе будет только 1 соединение. И если эту же программу запустить с другого компа(когда уже какая-то версия запущенаи между сервером и программой происходит обмен), то соединение произойдет, первый пакет с логином и паролем отправиться,но будет висеть в сокете, в очереди на подключение до тех пор, пока пользователь не выйдет из програамы, запущенной на первом. И сервер не будет знать ни клиентский адрес, ни порт, ни дескриптор этого клиентского второго соединения,потому как accept() не делал сервер.. Вот для этого клиента мне нужно определить находится ли он в очереди на подключение или же сервер сделал этому подключению accept() и между ними происходит обмен...Как-то так
|
|
|
ViGOur |
24.4.2009, 16:04
Сообщение
#16
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Если имя пользователя уникальное, то все также, как я описал выше.
Примерно так: При соединении клиента CManageConnection ищет в m_listCon соединени ли с ним уже пользователь или нет.Если нет, то создает указатель на CManageClient и передает ему управление. Если же соединен, то передает в существующий CManageClient описание клиента, а тот уже как только так сразу достает это описание из очереди и ... |
|
|
blondinka |
24.4.2009, 16:19
Сообщение
#17
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Если 2 копии программы и запускаются с разных компов, да и даже с одного компа, то в это классе будет всего 1 запись. Это существующее соединение. 1 копия клиента - 1 запуск - 1 соединение. Когда я втроой раз запущу программу, то пользователь введет логин и пароль и этот класс не будет знать,запущена ли еще какая-нибудь копия этой программы или нет
Та же аналогия с аськой. Ты когда клиента запускаешь, то этот клиент не знает сколько его копий запущено и с какими логинами. Сообщение отредактировал blondinka - 24.4.2009, 16:11 |
|
|
Andrew Selivanov |
24.4.2009, 17:03
Сообщение
#18
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
Если 2 копии программы и запускаются с разных компов, да и даже с одного компа, то в это классе будет всего 1 запись. Это существующее соединение. 1 копия клиента - 1 запуск - 1 соединение. Когда я втроой раз запущу программу, то пользователь введет логин и пароль и этот класс не будет знать,запущена ли еще какая-нибудь копия этой программы или нет Та же аналогия с аськой. Ты когда клиента запускаешь, то этот клиент не знает сколько его копий запущено и с какими логинами. Прочитал все посты, не понял, прочитал еще раз, опять не понял Ты напиши что ты хочешь сделать конкретно... Вообще если нужно, чтобы под одним логином и паролем двое не зашли, то в твоей базе логинов и паролей нужно завести поле АКТИВЕН и проверять его. |
|
|
Гость_Авварон_* |
26.4.2009, 8:48
Сообщение
#19
|
Гости |
Если 2 копии программы и запускаются с разных компов, да и даже с одного компа, то в это классе будет всего 1 запись. Это существующее соединение. 1 копия клиента - 1 запуск - 1 соединение. Когда я втроой раз запущу программу, то пользователь введет логин и пароль и этот класс не будет знать,запущена ли еще какая-нибудь копия этой программы или нет Та же аналогия с аськой. Ты когда клиента запускаешь, то этот клиент не знает сколько его копий запущено и с какими логинами. Прочитал все посты, не понял, прочитал еще раз, опять не понял Ты напиши что ты хочешь сделать конкретно... Вообще если нужно, чтобы под одним логином и паролем двое не зашли, то в твоей базе логинов и паролей нужно завести поле АКТИВЕН и проверять его. я к сожалению не работал с qtшными сокетами, но юзал sys/socket. Так вот при коннекте к серверу никакая авторизация не требуется - сервер сделает accept() в любом случае, если к нему делают connect() В слычае аськи, после соединеия передаются логин/пароль, сервер сверяет и высылает спец сообщение о том можно подключиться или нет. Возможно сервер принимает 1 подключение вообще? Тогда да, он зависнет до тех пор, пока управление не попадет к ф-ии accept() типа for(;;){ accept; read/write; close(); } Но так обычно никто не делает - либо 2 потока - для акссепта/передачи данных, либо 1 через ф-ию select(). Хотелось бы увидеть код сервера, отвечающий за соединение, туда нужно как раз вставить посылку служебного сообщения. |
|
|
blondinka |
26.4.2009, 17:44
Сообщение
#20
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Аналогию с аськой проводила для того, чтобы показать, что вариант с классом менеджер подключений мне не подойдет.
Сервер писала тоже я, и могу сказать, что у меня авторизация требуется и accept() делается только для первого подключения, а второе висит в сокете до тех пор, пока первый не закроет свое подключение, тогда для второго делает accept() (сервер работает на селекте), т.е. сразу после accept в select уже передается дескриптор клиента и соответственно он работает уже с этим подключением. В Qt , как я поняла, определяется connect или нет, только по совпадению адреса сервера и порта. Мне как разне нужно,чтобы двое заходили..Мне нужно: Если это втрое или n-ное подключение, то опеделить это, т.е сотояние сокета, сделал ли мне сервер accept() (и принимает мои пакеты, и отвечае мне) или же это соединение висит в очереди ожидающих подключение. Сервер вообще трогать не надо..Надо в клиенте определить сделал ли мне сервер accept или нет. |
|
|
Текстовая версия | Сейчас: 27.12.2024, 16:23 |