|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
Socket: Client & Server11.05.2010, 22:15. Показов 16108. Ответов 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|