crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Вопросы по сокетам., Чтение/Запись в сокет..
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  


Если имя пользователя уникальное, то все также, как я описал выше. :)
Примерно так:
// Класс соединения одного пользователя
class CManageClient
{
protected:
   QString m_szLogin;
   CClient *m_pClient;
   QQueue<CClient *> m_queue;
// ...
};

// Класс управления соединениями
class CManageConnection
{
protected:
   QList<CManageClient*> m_listCon;
// ...
};
При соединении клиента 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  


Цитата(blondinka @ 24.4.2009, 17:19) *
Если 2 копии программы и запускаются с разных компов, да и даже с одного компа, то в это классе будет всего 1 запись. Это существующее соединение. 1 копия клиента - 1 запуск - 1 соединение. Когда я втроой раз запущу программу, то пользователь введет логин и пароль и этот класс не будет знать,запущена ли еще какая-нибудь копия этой программы или нет

Та же аналогия с аськой. Ты когда клиента запускаешь, то этот клиент не знает сколько его копий запущено и с какими логинами.


Прочитал все посты, не понял, прочитал еще раз, опять не понял :) Ты напиши что ты хочешь сделать конкретно...

Вообще если нужно, чтобы под одним логином и паролем двое не зашли, то в твоей базе логинов и паролей нужно завести поле АКТИВЕН и проверять его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Авварон_*
сообщение 26.4.2009, 8:48
Сообщение #19





Гости








    


Цитата(Andrew Selivanov @ 24.4.2009, 17:03) *
Цитата(blondinka @ 24.4.2009, 17: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 или нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


11 чел. читают эту тему (гостей: 11, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 0:17