Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/81: Рейтинг темы: голосов - 81, средняя оценка - 4.69
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772

Socket: Client & Server

11.05.2010, 22:15. Показов 16744. Ответов 86
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужен квалифицированный совет!
Существует устройство, на котором стоит ОС Linux.
Это устройство соединено с ПК с Win.
Это устройство с ОС Линукс должно отдавать постоянно данные на ПК, но при помощи приложения на ПК оно еще должно управляться.
Используя сокеты, написан сервер на "С" под Линукс и Клиент на "С++" под Win на ПК. Но чувствую что этого недостаточно.
Как я понял, сервер не может осуществлять постоянную передачу данных, кроме ответных сообщений на запрос от клиента. Если не прав - поправьте меня.
Т.е., как я догадываюсь, нужно реализовывать на обоих машинах и сервер и клиент? Клиент под Линукс нужен чтобы постоянно отправлять данные от устройства серверу на ПК, а сервер ПК будет подтверждать прием данных, сервер под линукс нужен чтобы принимать запросы от клиента из Win (ПК) на упраление (изменение параметров устройства).
Правильные мысли? Или можно сделать проще?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2010, 22:15
Ответы с готовыми решениями:

FTP-client на Socket API
Здравствуйте. Решил написать простенький FTP-клиент, всё получилось, кроме команды RETR. При получении файла приходит больше байт, чем...

Local chat, C++ server JAVA client
Хочу написать локальный чат чтобы серверная часть была на C++ а клиентская на JAVA. По какой то причине JAVA не может принимать сообщения...

Server&Client Socket, ошибка подключения
При подключении к серверу вылетает ошибка 10060,10049,10061 У меня Win7 но если сервер будет на WinXP то подключается. В чём прикол?

86
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
17.05.2010, 21:03  [ТС]
Студворк — интернет-сервис помощи студентам
fasked, спасибо за информацию, но я уже понял в чем дело и как правильно отправлять/получать куски файла.
Для отправки не надо вычислять остаток, просто нужно знать конец файла и текущий указатель при чтении, и прочитать (конец-указатель) байт в случае, когда (конец-указатель)<размера блока отправляемых данных.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.05.2010, 22:35
Цитата Сообщение от sitesv Посмотреть сообщение
fasked, спасибо за информацию, но я уже понял в чем дело и как правильно отправлять/получать куски файла.
Для отправки не надо вычислять остаток, просто нужно знать конец файла и текущий указатель при чтении, и прочитать (конец-указатель) байт в случае, когда (конец-указатель)<размера блока отправляемых данных.
ну смысл то тот же =)
0
 Аватар для coderXLsn
49 / 49 / 3
Регистрация: 16.05.2010
Сообщений: 348
18.05.2010, 01:40
Выложишь полные сорцы. Интересно посмотреть на все это дело в куче
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 18:35  [ТС]
При нажатии в клиенте кнопки соединения с сервером, хочу реализовать автоматический коннект, при последующем включении сервера.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//КОНТРОЛЬ ВОЗМОЖНОСТИ СОЕДИНЕНИЯ-------------------------------------------------
while(1)
{
    ZeroMemory (&adr_serv, sizeof (adr_serv));
    adr_serv.sin_family = AF_INET;
    adr_serv.sin_addr.S_un.S_addr = inet_addr (dest_ip.c_str());
    adr_serv.sin_port = htons (StrToInt(dest_port));
 
    FD_ZERO (&for_select_connect);
    FD_SET (s, &for_select_connect); // Обнуляем множество // Заносим в него наш сокет
    time_out_connect.tv_sec=0;
    time_out_connect.tv_usec = 0; //Таймаут 0.0 секунды.
    int res_send_connect=select (0, NULL, &for_select_connect, NULL, &time_out_connect);
     if (res_send_connect!=0)
     {
         break;
     }
     Sleep(1);
}
Запускаю этот цикл в клиенте, жду запуска сервера. Запускаю сервер, но while продолжает крутиться... Всякие комбинации с селектом перепробовал... Не могу понять в чем косяк... Котел использовать оператор fcnt(), но он с флагом O_NONBLOCK делает сокет неблокирующим, а как, после коннекта сделать его опять блокирующим, не смог пока ответить на этот вопрос, может кто подскажет?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 19:56
sitesv, ты хоть объясни, что это у тебя за код и что за сокет? Когда пишут про кнопку, то интуитивно кажется, что дело идёт о клиенте, хотя у тебя похоже на код сервера. Без внятных пояснений, что такое for_select_connect (ибо "наш сокет" не канает), тебе никто ничего не скажет

Ну и ремарка: вместо S_un (что соответствует AF_UNIX) должно быть S_in (что соответствует AF_INET).
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 20:32  [ТС]
это код для клиента, в структуру (sockaddr_in) adr_serv заносится тип сокета, ip адрес сервера (dest_ip),
и порт сервера dest_port, на который и будет происходить соединение.
for_select_connect - это множество, в которое заносится дескриптор сокета, созданного на клиенте ("наш сокет"), и потом это множество используется в select.
За ремарочку спасибо. Но, если у меня идет соединение с сервером, который реализован в Linux, то может быть S_un в данном случае актуально?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
20.05.2010, 20:52
Цитата Сообщение от sitesv Посмотреть сообщение
Но, если у меня идет соединение с сервером, который реализован в Linux, то может быть S_un в данном случае актуально?
не в этом дело, unix-socket это совершенно другая тема, иначе его называют IPC Socket и используются они для межпроцессорного взаимодействия. То есть для обмена данными между процессами одного компьютера - локально, никакого отношения к сети они по сути не имеют о__О
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 20:59  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
не в этом дело, unix-socket это совершенно другая тема, иначе его называют IPC Socket и используются они для межпроцессорного взаимодействия. То есть для обмена данными между процессами одного компьютера - локально, никакого отношения к сети они по сути не имеют о__О
Да, здесь я ошибся, соглашаюсь. Но вопросы в последнем посте с кодом сохраняю.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 21:44
Что значит "while продолжает крутиться"? У тебя select отрабатывает или нет (т.е. циклится внутри него или из него выходим, но с нулевым результатом)? И что ты ожидаешь? select должен отработать только тогда, когда со стороны сервера пришли какие-то данные на "наш сокет"

> for_select_connect - это множество, в которое заносится дескриптор сокета

Что ты с этим сокетом сделал? Просто создал или на сервер законнектился? Я вижу, что ты заполняешь структуру addr_serv, но не вижу, чтобы ты дальше с ней что-то делал
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 21:57  [ТС]
вернусь в смысл идеи, которую преследую...
есть оператор connect, для которого впоследствии, после выхода из while, планировал использовать addr_serv. Видимо это и был мой косяк... Оператор connect использую для соединения с сервером. но, он является блокирующим, а я не хочу, чтобы программа зависала до того, как произойдет соединение с сервером. Но... рассматриваю ситуацию, когда клиент пытается подключиться, но получает отрицательный ответ, и клиент продолжает пробовать наладить связь с сервером. Потом, допустим, запускаем сервер, и клиент после этого организует коннект с сервером.
Не хочу использовать оператор fcnt, который делает connect, как понимаю и все остальные блокирующие операторы, неблокирующими. Быть может есть возможность сделать неблокирующим connect, а после соединения опять сделать блокирующим? Опыта пока в этом нет.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 22:03
Цитата Сообщение от sitesv Посмотреть сообщение
есть оператор connect, для которого впоследствии, после выхода из while, планировал использовать addr_serv
Поставил телегу вперёд лошади. Сначала надо connect сделать, а уж потом ждать чего-то. Сокет - это всего лишь некий абстрактный дескриптор, пока ты его не свяжешь с каким-либо сетевым ресурсом - это будет кусок воздуха, в который нельзя ни читать, ни писать и который никаких признаков жизни подавать не будет

Если хочешь, чтобы какой-то процесс не тормозил клиент - делай его в потоке. А для начала сделай хоть что-то хоть как-то без умностей и выкрутасов. Когда заставишь работать программу хотя бы через ж..у, тогда и будешь думать, как оптимизировать и улучшать. Это относится не только к сетевой программе, но и к любой программе вообще
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 22:07  [ТС]
Да, согласен. Уже отписал, что ошибся... это об лошади позади телеги.
Как раз сделал, что работает, что коннект срабатывает, когда загружен сервер, а клиент пытается к нему подключиться. Да, по поводу потока, пытаюсь по таймеру подключиться... но вот и стал вопрос по поводу блокировки connect'a. как можно красиво обойти коннект без глобальной "разблокировки" операторов.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 22:10
Про блокировки я все предложения просто игнорировал, ибо так и не понимаю, что сие такое есть
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 22:15  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Про блокировки я все предложения просто игнорировал, ибо так и не понимаю, что сие такое есть
грубо говоря, когда выполняется коннект, к сервер не загружен, указатель дальше коннекта не идет...
есть операторы, которые позволяют сделать такую вещи неблокируюшей, т.е. указатель с коннекта пойдет дальше, но коннект вернет значение, которое соответствует ошибке или состоянию неподключенности. но я не хочу через неблокирующие состояния впоследствии работать...
т.е. если в потоке, коннект в котором заблокируеься, нет смысла использовать другие, а другие мне нужны как раз для управления отправкой/приемом сообщения (данных)...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 22:21
Я никогда с таким не сталкивался. Чисто технически не очень понимаю, как процесс соединиения можно делать неблокируемым
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 22:28  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Я никогда с таким не сталкивался. Чисто технически не очень понимаю, как процесс соединиения можно делать неблокируемым
нет, тут не процесс соединения неблокируемый, тут смысл в том, что в любом случае connect вернет какое-то значение, а в случае настройки на неблокирующее состояние оператором, коннект вернет значение только в случае положительного результата или в случае технического сбоя.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 22:50
Т.е. фактически процесс соединения запустится в потоке на уровне ядра, а пользователь в цикле будет обращаться к connect'у до тех пор, пока поток не соединится или не обломается? Что-то не верю я в такие затеи
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 22:57  [ТС]
http://www.thalion.kiev.ua/idx.php/17/532/article/
вот здесь пытаются через fcntl() делать, но переводя connect в неблокирующее состояние...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
20.05.2010, 23:08
Интересная статья. Автор не поленился доступными словами изложить суть. Но я толком техническую часть не понял. Тут надо экспериментировать. В итоге проблема в чём? Я так понял, что через неблокирующий сокет ты смог сделать соединение, но потом не получилось сделать его НЕблокирующим?
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
20.05.2010, 23:38  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Я так понял, что через неблокирующий сокет ты смог сделать соединение, но потом не получилось сделать его НЕблокирующим?
Нет, наоборот, когда не настраивая в неблокирующее состояние, коннект срабатывает при включенном сервере, а вот чтоб строчка, где коннект, выполнялась и в случае когда сервер не включен, т.е. коннект заблокируется, я так и не понял как сделать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2010, 23:38

Nodejs net socket server and android socket client
Добрый день Форумчане нужно помощь гуру! Решил с другом написать сервер на ноде с использование сокетов и андроид клиент отправки сокет. Но...

Windows socket server python + socket client js
Здравствуйте пытаюсь решить такую задачу, на веб странице реализовал soket клиент на js, и socket server, сокет сервер получает данные от...

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение. Клиент - приложение на Android устройстве. Сервер - Приложение...

Server(Client)Socket
Всем привет. Собираюсь сделать передачу команд между сервером-клиентом через socket'ы, но возник один вопрос: будут ли проблемы с...

Socket Server, Client
Доброго времени суток. Решил разобраться с сокетами. Но почему-то сообщения не приходят... Клиент: messsage = &quot;Test&quot;; ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru