|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
Socket: Client & Server11.05.2010, 22:15. Показов 16180. Ответов 86
Метки нет (Все метки)
Нужен квалифицированный совет!
Существует устройство, на котором стоит ОС Linux. Это устройство соединено с ПК с Win. Это устройство с ОС Линукс должно отдавать постоянно данные на ПК, но при помощи приложения на ПК оно еще должно управляться. Используя сокеты, написан сервер на "С" под Линукс и Клиент на "С++" под Win на ПК. Но чувствую что этого недостаточно. Как я понял, сервер не может осуществлять постоянную передачу данных, кроме ответных сообщений на запрос от клиента. Если не прав - поправьте меня. Т.е., как я догадываюсь, нужно реализовывать на обоих машинах и сервер и клиент? Клиент под Линукс нужен чтобы постоянно отправлять данные от устройства серверу на ПК, а сервер ПК будет подтверждать прием данных, сервер под линукс нужен чтобы принимать запросы от клиента из Win (ПК) на упраление (изменение параметров устройства). Правильные мысли? Или можно сделать проще?
1
|
|
| 11.05.2010, 22:15 | |
|
Ответы с готовыми решениями:
86
FTP-client на Socket API Local chat, C++ server JAVA client Server&Client Socket, ошибка подключения |
|
|
|
| 11.05.2010, 22:21 | |
|
Зачем. Создаёте сервер на одной стороне. С другой подключитесь к нему. и общайтесь. Не знаю про UNIX-сокеты (только начал с ними), но в WinSock2 функции recv() и send() запрашивают дескриптор сокета, по которому установлено соединение. То есть по однократно установленному соединению можно и отправлять, и принимать пакеты.
Но! Можно либо ждать пакета, либо отправлять пакеты. Поэтому в двух разных потоках (см. _beginthread) нужно установить два соединения. Сначала одно, а потом, после установки первого - второе. И обязательно убедиться на сервере, что оба соединения установлены с одним и тем же клиентом! А затем по одному соединению сервер будет выводить - клиент вводить, а по другому - наоборот. Я сам застрял на программировании сокетов с этой многопоточностью. Так что сначала - к ней.
1
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||
| 11.05.2010, 22:29 [ТС] | ||
|
Т.е. получается эти 2 потока на сервере должны быть синхронизированы? Как на "С" синхронить? в билдере использовал критические секции.
1
|
||
|
|
|
| 11.05.2010, 22:49 | |
|
По поводу многопоточности - посмотрите _beginthread. Не знаю на счёт UNIX, в Windows работает.
Если потоки получают доступ к общим объектам - да, они должны быть синхронизированы. В C нет такого понятия, как критические секции, просто по тому, что в C нет встроенной многопоточности (это всё-таки универсальный язык!). Критические секции - это спецификация Windows. В Windows-клиенте можете использовать их. Для Linux слышал о библиотеке boost, в ней были объекты mutex'ы. Только не знаю, сишная ли она. Вроде нет, но поискать стоит. Так же поищите информацию по pthread.h - тоже для Linux. --- ДОБАВЛЕНО: pthread.h должен вас устроить. Есть и реализация для Win32. Читайте wikipedia. Попробуйте также английскую.
1
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 12.05.2010, 10:55 [ТС] | |
|
Хорошо, как я понял идея следующая:
сервер размещаю на машине, где стоит линукс, создаю 2 потока, которые постоянно должны крутиться. Один отвечает за отправку данных клиенту, а второй за прием команд от клиента. А со стороны клиента как сделать так, чтобы одновременно получать данные от сервера и отправлять команды? тоже 2 потока? Немного не ясно... Хэлп.
1
|
|
|
|
||||||
| 12.05.2010, 11:30 | ||||||
|
Я себе это так представляю:
Схема связи:
Сервер создаёт первый поток и прослушивает порт 41000 Клиент создаёт первый поток и подключается к серверу по 123.45.76.89:41000 Сервер отправляет клиенту сучайный код, скажем 0x21f1 Клиент возвращает его серверу Первое соединение установлено Сервер создаёт второй поток, прослушивает порт 41001 Клиент создаёт второй поток и в нём подключается к 123.45.76.89:41001 Клиент отправляет сервер 0x21f1 (то, что отправил ему сервер в первом соединении) Сервер таким образом убеждается, что соединился с правильным клиентом Второе соединение установлено Ну и вперёд...
2
|
||||||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 12.05.2010, 12:03 [ТС] | |
|
Вопрос:
на сервере использую функцию извлечения запроса accept, но она похоже является блокирующей, пока никакого соединения от клиента не случилось, указатель дальше не продвинется... а как сделать, чтобы отсутствовала блокировка, а просто выводился флаг, что ничего от клиента не поступило, и указатель продвинулся дальше?
1
|
|
|
|
|
| 12.05.2010, 12:09 | |
|
Мне такой способ не знаком. Возможно, асинхронные сокеты, но я с ними не работал. А чем вас не устраивает блокировка? С ней вы гарантированно получите пакет сразу, как только он придёт от клиента. К тому же вывод осуществляется в соседнем потоке, параллельно. Если у вас есть ещё рабочие задачи, выполняйте их в потоке вывода, либо выделите ещё один поток, в котором их выполняйте. А эти два оставьте на ввод-вывод.
1
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||||||
| 12.05.2010, 17:02 [ТС] | ||||||
|
Пытаюсь отладить простейший механизм, но сообщение на сервер приходят начиная со второй отправки, т.е. первый раз отправил, на сервер ничего не пришло, при второй отправке на сервер поступает первое сообщение, почему так?
Вот код сервера:
ps. Считаем что все функции выше while выполнены без ошибок.
0
|
||||||
|
|
||
| 12.05.2010, 17:13 | ||
|
если одна стороная отправила сообщение, вторая обязательно должна принять. так что, надо бы код и сервера и клиента. а код сервака честно говоря страшный оО
0
|
||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||||||
| 12.05.2010, 21:21 [ТС] | ||||||
|
Код клиента:
1. Сначала нажимаю на клавишу соединения. 2. Потом жму на клавишу отправки сообщения
fasked, ну как, есть мысли? Добавлено через 37 минут нааарод, помогай))
0
|
||||||
|
|
|
| 12.05.2010, 21:28 | |
|
sitesv, не нужно мудрить с двумя потоками. Достаточно одного TCP-соединения. Клиент и сервер - понятия условные: сервер создаёт соединение, а клиент к нему прицепляется. В дальнейшем конкретно в данном случае обе стороны соединения могут быть равноправными: обе отправляют и принимают данные. Грубо говоря, как irc - события могут возникать как на клиентской стороне, так и на стороне сервера
1
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 12.05.2010, 21:31 [ТС] | |
|
Evg, хорошо, учту, но тут для начала я решил написать что-то простенькое, так сказать основу, которую вдальнейшем можно использовать, на 1й странице есть код сервера, на 2й - код клиента, когда отправляю на сервер запрос, recv принимает эти данные только при повторной отправки на клавишу отправки сообщения, т.е. получается, что сервер принимает данные с "задержкой", видимо в коде что-то не в порядке, пока еще не смог разобраться в чем причина... может будут мысли - буду признателен.
0
|
|
|
|
|
| 12.05.2010, 21:43 | |
|
Я уже несколько лет, как с сетевыми задачами не работал, так что глядя только на код в воздухе ничего сказать не могу. Пример простенького сервера под линух с небольшим описанием можно посмотреть здесь Грамотная реализация клиент-серверного приложения (посты #9 и #10)
0
|
|
|
|
|
| 12.05.2010, 23:39 | |
|
Если у вас устройство ждёт сообщения с компьютера, реагирует на него либо отправкой какого-либо ответа, либо действием, то тогда согласен, многопоточность здесь ни к месту. Но если устройство может по своей инициативе что-то отправить компьютеру, а компьютер - устройству - тогда либо многопоточность, либо неблокирующиеся сокеты. Но я с ними не работал, тут ничем помочь не смогу.
1
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 12.05.2010, 23:45 [ТС] | |
|
Можно при однократном создании сокета и инициализации адреса и порта, дальше многократно использзовать операторы отправки и приема?
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 13.05.2010, 09:28 [ТС] | |
|
А если изначально неизвестно как построен сервер, известен только его адрес и порт, то зависит ли повторная инициализация сокета итд на клиенте от этого?
Взял пример с сайта http://club.shelek.ru/viewart.php?id=37. Пытаюсь повторно использовать операторы send, а потом receive, но выдается ошибкА, что длина данных нулевая... быть может сервер закрывает соединение после однократного обращения? Добавлено через 7 часов 45 минут есть мысли? Добавлено через 1 час 47 минут есть мысли?
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 13.05.2010, 10:42 [ТС] | |
|
0
|
|
| 13.05.2010, 10:42 | |
|
Помогаю со студенческими работами здесь
20
Nodejs net socket server and android socket client Windows socket server python + socket client js Socket Android Client and Java Socket Server
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|