Форум программистов, компьютерный форум CyberForum.ru

Сокеты, клиент-сервер - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.86
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
04.12.2012, 00:29     Сокеты, клиент-сервер #1
Вопрос такой, примерно понял что такое сокеты, и вот надо программу наподобие сервер-клиент создать. То есть клиент- это некий процесс, который выполняет операцию определенную.
Вопрос такой.
Вот сервер у нас ждет пока к нему подключатся, и потом может отправить задание клиенту. Клиент его примет и начнет выполнять( конечно на это надо время). Потом клиент отправит ответ обратно. Сервер примет его и запишет.

Вопросы)
1- Клиент подключился. Сервер отправил ему задание. ( в клиенте стоит задержка Sleep(ххх). ) после того как клиент примет задание и начнет выполнять, он отключается от сервера? Свободен ли будет сокет сервера, после отправки задания и до приема ответа?
2- Если несколько клиентов, то создается в сервере один сокет на все и они стоят в очереди?
3- Есть какая-то фишка, что вызывая .ехе клиент несколько раз(запуская несколько процессоров) сервер нормально определит что кому отправить, что от кого принять? там не нужно особой мудрости?

Добавлено через 1 час 43 минуты
просто непонятно с чего даже начинать
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 00:29     Сокеты, клиент-сервер
Посмотрите здесь:

Клиент-сервер , скриншот C++
Виртуальный файловый сервер/клиент C++
C++ Исходники клиент-сервер?
C++ Клиент и сервер под SMTP
TCP клиент/сервер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
04.12.2012, 11:22     Сокеты, клиент-сервер #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
сервер создает сокет функцией socket и связывает его с адресом функцией bind. адрес указываемый при связывании является адресом одного из сетевых адаптеров сервера. адрес "0" используется для указания всех установленных на машине сетевых адаптеров. порт указываемый при связывании используется для приема запросов на соединение от клиентов. сервер начинает слушать порт ожидая клиентов функцией listen.
-
клиент создает сокет функцией socket и соединяется с сервером функцией connect. адрес указываемый при соединении является адресом сервера (адресом любого из сетевых адаптеров сервера через который мы можем с ним соединиться). порт указываемый при соединении является портом сервера (портом который слушает сервер).
-
сервер принимая соединение от клиента функцией accept получает от системы новый сокет (для каждого клиента). порт, используемый при автоматическом создании сокета выделяется системой и не совпадает с портом который слушает сервер.
-
сервер и клиент обмениваются данными при помощи функций send/recv. кто из них пошлет данные первым, как участники обмена будут на них реагировать и что они будут делать между посылками определяется протоколом и логикой работы программы. как правило функция сервера заключается в обработке данных: клиент посылает серверу запрос, сервер его обрабатывает и посылает клиенту ответ. если используется такая схема, то после приема соединения сервер вызывает функцию recv ожидая входящие данные, а клиент вызывает функцию send отправляя их серверу. после этого они меняются местами: сервер подготовив данные вызывает функцию send, а клиент должен ждать ответа функцией recv. если сокеты блокирующие вызовы данных функций приостановят выполнение программы до момента возврата из функции. обычно для сервера это нежелательно. следует либо использовать функцию select для проверки наличия входящих данных (вызов recv производится только если данные есть) либо использовать неблокирующие сокеты которые при отсутствии входящих данных не ожидают, а сразу возвращают код ошибки (в этом случае функция recv будет вызываться периодически до тех пор пока данные не будут получены). перевод сокета в неблокирующий режим производится функцией ioctlsocket.
-
разрыв соединения может быть произведен любым из участников функцией closesocket. если при этом другой участник обмена вызовет функцию recv она вернет ноль, функция send вернет ошибку. реакция участников на разрыв соединения определяется протоколом и логикой работы программы. как правило если сервер получает ноль при вызове recv он считает что клиент штатно отключился, если сервер при вызове recv/send получает код ошибки он считает что клиент отключился нештатно. если зафиксировано отключение клиента сервер закрывает сокет клиента со своей стороны и освобождает принадлежащие клиенту ресурсы. в свою очередь если клиент получил ошибку при вызове функции send/recv он считает что связь с сервером была потеряна, закрывает сокет и может попытаться произвести повторное подключение. некоторые протоколы подразумевают схему "подключение со стороны клиента-запрос от клиента-ответ от сервера-отключение со стороны сервера". в этом случае факт разрыва соединения (естественно на определенном этапе) является частью процедуры обмена данными. однако для таких протоколов перед отключением необходимо позаботится о том что бы доставка состоялась при помощи функции shutdown. впрочем для других схем такой вызов тоже крайне желателен.
=
1 - отключается он или нет зависит от протокола. послушиваемый сервером порт всегда свободен. автоматически выделенный порт клиента на стороне сервера всегда занят пока клиент к нему подключен.
2 - нет, каждый клиент получает свой порт
3 - данные приходят на сокет. сокет выделяется для каждого подключившегося клиента. что делать с данными именно этого клиента и как идентифицировать клиентов определяется протоколом и логикой работы программы.
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
05.12.2012, 00:09  [ТС]     Сокеты, клиент-сервер #3
Цитата Сообщение от vxg Посмотреть сообщение
вызов recv производится только если данные есть)
тоесть я вызвал функцию, а данных нет, появиться ошибка?


Цитата Сообщение от vxg Посмотреть сообщение
2 - нет, каждый клиент получает свой порт
создал я сервер и клиентов, и компилятор свяжет их, и поймет кому что отправлять?

просто для реализации программно не понимаю как сделать, что сервер отправил данные одному процессу, пока тот обрабатывает сервер отправляет данные другому свободному процессу. как это реализовать программно у меня загадка еще. какой цикл, какие проверки
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
05.12.2012, 10:36     Сокеты, клиент-сервер #4
Цитата Сообщение от pavlovnik Посмотреть сообщение
тоесть я вызвал функцию, а данных нет, появиться ошибка
если сокеты неблокирующие. если сокеты блокирующие то вызов recv при отсутствии входящих данных приведет к остановке программы и ожиданию данных.
Цитата Сообщение от pavlovnik Посмотреть сообщение
компилятор свяжет их
компилятор не связывает их. сокеты создаются во время выполнения программы. еще раз рассмотрим ваш пример. есть сервер (который в вашем случае не совсем сервер, а скорее распределитель нагрузки или раздатчик заданий для параллельной обработки). есть клиенты. сервер и клиенты запускаются. клиенты после запуска подключаются к серверу. на сервере формируется список подключенных клиентов. каждая запись списка содержит сокет и какую-нибудь специфичную для вашей обработки информацию. сервер когда ему нужно сделать обработку проходит по списку и раздает подключенным клиентам задания. после этого сервер периодически пробегается по списку ожидая от них ответа. когда от какого-нибудь клиента приходит результат обработки сервер забирает данные и использует так как у вас там принято. после забора данных сервер может поставить клиенту новое задание. так же постановка нового задания возможна сразу после подключения нового клиента если на сервере уже идет обработка и есть необходимость в новых участниках обработки.
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
05.12.2012, 22:52  [ТС]     Сокеты, клиент-сервер #5
Цитата Сообщение от vxg Посмотреть сообщение

компилятор не связывает их. сокеты создаются во время выполнения программы. еще раз рассмотрим ваш пример. есть сервер (который в вашем случае не совсем сервер, а скорее распределитель нагрузки или раздатчик заданий для параллельной обработки). есть клиенты. сервер и клиенты запускаются. клиенты после запуска подключаются к серверу. на сервере формируется список подключенных клиентов. каждая запись списка содержит сокет и какую-нибудь специфичную для вашей обработки информацию. сервер когда ему нужно сделать обработку проходит по списку и раздает подключенным клиентам задания. после этого сервер периодически пробегается по списку ожидая от них ответа. когда от какого-нибудь клиента приходит результат обработки сервер забирает данные и использует так как у вас там принято. после забора данных сервер может поставить клиенту новое задание. так же постановка нового задания возможна сразу после подключения нового клиента если на сервере уже идет обработка и есть необходимость в новых участниках обработки.



мне предложили такой вариант, обсудил с преподавателем.

запускаем агенты( в них бесконечный цикл, он пытается подключится) запускаем сервер. вводим заявки. когда ввели сервер слушает порт. когда соединение установлено агент отправляет некий шифр( цифру 1, типа, дай мне задание). Сервер читает, видит 1 и отправляет нужную заявку ему. Потом отключает агента. Агент отключился, и выполняет действия, потом опять ищет подключения. отправляет 2 серверу, типа прими данные. сервер читает двойку и готовится принять. как-то так. на коде еще не начинал даже реализовывать) боюсь будет сложно(
yura91
26 / 24 / 2
Регистрация: 23.10.2013
Сообщений: 2,064
06.03.2015, 11:26     Сокеты, клиент-сервер #6
ioctlsocket переводит сокет в неблокирующий режим, а если сокет неблокирующий то какая функция в блокирующий режим переведет??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2015, 11:28     Сокеты, клиент-сервер
Еще ссылки по теме:

Winsock C++ клиент - сервер C++
C++ Программы клиент-сервер
Что сделать, чтобы не выбрасывало из цикла? Сокеты, СИ, клиент, сервер C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
06.03.2015, 11:28     Сокеты, клиент-сервер #7
Цитата Сообщение от yura91 Посмотреть сообщение
ioctlsocket переводит сокет в неблокирующий режим, а если сокет неблокирующий то какая функция в блокирующий режим переведет??
пальцем в небо - та же самая. просто ей будет передаваться не 1 а 0
Yandex
Объявления
06.03.2015, 11:28     Сокеты, клиент-сервер
Ответ Создать тему
Опции темы

Текущее время: 18:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru