Вопросы по сокетам., Чтение/Запись в сокет.. |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы по сокетам., Чтение/Запись в сокет.. |
Авварон |
27.4.2009, 21:33
Сообщение
#21
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
Аналогию с аськой проводила для того, чтобы показать, что вариант с классом менеджер подключений мне не подойдет. Сервер писала тоже я, и могу сказать, что у меня авторизация требуется и accept() делается только для первого подключения, а второе висит в сокете до тех пор, пока первый не закроет свое подключение, тогда для второго делает accept() (сервер работает на селекте), т.е. сразу после accept в select уже передается дескриптор клиента и соответственно он работает уже с этим подключением. В Qt , как я поняла, определяется connect или нет, только по совпадению адреса сервера и порта. Мне как разне нужно,чтобы двое заходили..Мне нужно: Если это втрое или n-ное подключение, то опеделить это, т.е сотояние сокета, сделал ли мне сервер accept() (и принимает мои пакеты, и отвечае мне) или же это соединение висит в очереди ожидающих подключение. Сервер вообще трогать не надо..Надо в клиенте определить сделал ли мне сервер accept или нет. менеджер подключений О_о в сервере: "accept() if(bool) close; else {bool = true; рабочий цикл; close; bool=false;}" к серверу невозможно сделать 2 подключения, если он не хочет делать accept() в чем вообще проблема изменить чуть-чуть сервер? собственно accept и нужен для того, чтобы сервер мог установить соединение и передать отказ "лишнему" клиенту. если настолько в лом переделывать сервер - делай тайм аут. если не ошибаюсь, то вызов connect блокирует приложение => до коннекта пускаем таймер по истечении которого, если мы не прошли коннект, рубим клиента |
|
|
blondinka |
28.4.2009, 9:32
Сообщение
#22
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Сервер хочет делать accept, но не видит второго подключения вообще до тех пор,пока первый не разорвет свое соединение, т.к в select передается дескриптор этгго первого подключения.
Connect приложение проходит, вопрос собственно состоял в том,есть ли функция в Qt, определяющая состояние сокета. |
|
|
ViGOur |
28.4.2009, 10:30
Сообщение
#23
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Глянь: QAbstractSocket::SocketState.
Пойдет? |
|
|
blondinka |
28.4.2009, 13:10
Сообщение
#24
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Угу, видела)
Только не могу найти что значит ListeningState... |
|
|
fsMark |
28.4.2009, 14:02
Сообщение
#25
|
Студент Группа: Участник Сообщений: 97 Регистрация: 23.4.2008 Из: г. Киров Пользователь №: 155 Спасибо сказали: 10 раз(а) Репутация: 1 |
|
|
|
blondinka |
28.4.2009, 14:10
Сообщение
#26
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Ясно, значит, это тоже относится к серверу и не подойдет...
|
|
|
ViGOur |
28.4.2009, 14:50
Сообщение
#27
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Как я понял, для твоего клиента тебе нужно проверять в каком состоянии находится сокет в QAbstractSocket::UnconnectedState или QAbstractSocket::ConnectedState. Если я не ошибаюсь, то состояние QAbstractSocket::ConnectedState должно быть после того, как сервер сделал accept, а это именно то, что тебе нужно.
|
|
|
blondinka |
28.4.2009, 15:43
Сообщение
#28
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
В том-то и дело, что он посылает сигнал connected(), когда хост найден и порт совпадает..а сделан ли accept() или нет, его мало волнует. Т.е. мой клиент хост находит порт совпадает и высылает мне этот сигнал, и соотвественно находится в состоянии QAbstractSocket::ConnectedState.
|
|
|
Текстовая версия | Сейчас: 28.12.2024, 7:54 |