Вопросы по сокетам., Чтение/Запись в сокет.. |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы по сокетам., Чтение/Запись в сокет.. |
defnull |
18.5.2008, 19:19
Сообщение
#1
|
Студент Группа: Участник Сообщений: 49 Регистрация: 1.5.2008 Пользователь №: 165 Спасибо сказали: 0 раз(а) Репутация: 1 |
Добрый день.
Имеется сервер, при подключении к которому клиента создаётся поток, который обрабатывает некоторые данные полученные от клиента, при этом информируя клиента о ходе выполнения. Требуется сделать так чтобы клиент мог влиять на ход выполнения. Проблема для меня заключается в том что я не совсем понимаю можно ли одновременно и читать и писать в сокет. Если я запишу информацию в сокет (клиент), что я получу при попытке прочитать от-туда (тотже клиент)? данные которые мне возможно отправил сервер или то что я отправил?? Иными словами является ли сокет своеобразным общим буфером, или сокет это эдакий двунаправленный буфер? Естественно всё это можно было бы проверить на практике, но хотелось бы понять, прежде чем бежать набивать шишки. Заранее спасибо. |
|
|
blondinka |
26.4.2009, 17:44
Сообщение
#2
|
Студент Группа: Участник Сообщений: 71 Регистрация: 8.4.2008 Из: Питер Пользователь №: 144 Спасибо сказали: 0 раз(а) Репутация: 3 |
Аналогию с аськой проводила для того, чтобы показать, что вариант с классом менеджер подключений мне не подойдет.
Сервер писала тоже я, и могу сказать, что у меня авторизация требуется и accept() делается только для первого подключения, а второе висит в сокете до тех пор, пока первый не закроет свое подключение, тогда для второго делает accept() (сервер работает на селекте), т.е. сразу после accept в select уже передается дескриптор клиента и соответственно он работает уже с этим подключением. В Qt , как я поняла, определяется connect или нет, только по совпадению адреса сервера и порта. Мне как разне нужно,чтобы двое заходили..Мне нужно: Если это втрое или n-ное подключение, то опеделить это, т.е сотояние сокета, сделал ли мне сервер accept() (и принимает мои пакеты, и отвечае мне) или же это соединение висит в очереди ожидающих подключение. Сервер вообще трогать не надо..Надо в клиенте определить сделал ли мне сервер accept или нет. |
|
|
Авварон |
27.4.2009, 21:33
Сообщение
#3
|
Студент Группа: Участник Сообщений: 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 блокирует приложение => до коннекта пускаем таймер по истечении которого, если мы не прошли коннект, рубим клиента |
|
|
Текстовая версия | Сейчас: 27.12.2024, 16:24 |