|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
Socket: Client & Server11.05.2010, 22:15. Показов 16153. Ответов 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, ошибка подключения |
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 22.05.2010, 13:30 [ТС] | |
|
Столкнулся с проблемой...
Передаю данные используя TCP протокол. Размер поля данных в TCP протоколе составляет примерно 1400 байт. Но, если у меня файл, который надо передать около 2 мб и его нарезаю по 1024 байт, то передача его затягивается секунд на 25-30 (эксперимент ставлю на одной машине, используя IP 127.0.0.1). Как увеличить скорость передачи данных? Ведь если нарезать файл на бОльшие куски, то размер данных за один раз на входе не будет всегда соответствовать размеру переданных за один раз данных. Только когда результирующие данные на входе будут =0, то файл успешно будет принят. А как например чтоб всегда было, что 1 раз отправил 100 кб - и за один раз принялось 100 кб...? Бывает ситуация, что на входе не за один раз принимаются 100 кб, а например за 2 раза, 25 кб в первый раз и 75 кб во второй... Есть возможность избежать такое?
0
|
|
|
|
|
| 22.05.2010, 13:38 | |
|
А ты уверен что проблема именно в сокетах? может быть ты файлы "нарезаешь" неоптимальным способом, потому что когда я передавал кусками по 512 байт по лупбэку у меня за 20-25 секунд уходили файлы куда большего размера, больше 1Гб точно
Добавлено через 2 минуты В любом случае фрагментация пакетов идет на другом уровне и думаю не так значимо, тем более значение MTU как правило равно 1500
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||
| 22.05.2010, 13:45 [ТС] | ||
|
Добавлено через 1 минуту А как оптимально нарезать?
0
|
||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||
| 23.05.2010, 12:56 [ТС] | ||
|
Добавлено через 2 часа 39 минут Происследовав чисто клиентскую часть, прихожу к выводу что у меня медленно передаются данные из одного потока в другой. В одном потоке формирую заголовок+1024байта, кладу в массив, сдвигаю указатель записи... В другом потоке сравниваю указатель чтения с указателем записи, и если есть отличие, то считываю из массива. В такой ситуации и получается, что 2мб по 1045 байт передаются почти 30 секунд... Хрень какая-то.... В конце каждого цикла потоков ставлю Sleep(1), чтобы процессор не слишком перегружался... Добавлено через 13 часов 33 минуты Меня всегда учили в конце каждого цикла в потоке ставить sleep(1), из-за этого долго и передавались данные из одного потока в другой и соответственно передавались на сервер)) но, убрав слипы, процессор ушел почти на 100%, неужто надо ставить флаги (метки), чтобы при передачи обходить слип?
0
|
||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||
| 23.05.2010, 20:19 [ТС] | ||
|
Добавлено через 1 час 38 минут Есть некоторое сомнение... Например, клиент, в потоке постоянно осуществляет передачу данных серверу, через select проверяю доступность сокета для передачи... Сервер в потоке пытается считать эти данные... например со стороны сервера процессор неособо мощный, т.е. скорость работы потока на сервере ниже чем на клиенте... не будет ли потери данных при приеме? Сколько отправишь столько же и примешь? либо есть какая-то максимальная очередь? Что-то очень волнует этот вопрос...
0
|
||
|
|
||
| 23.05.2010, 20:50 | ||
|
0
|
||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||
| 23.05.2010, 20:56 [ТС] | ||
|
А как решается вопрос по поводу потоков и Sleep() и загрузкой процессора?
0
|
||
|
|
|
| 23.05.2010, 21:10 | |
|
Поток он либо должен работать, либо нет. Потоки создают по двум причинам:
- для увеличения скорости вычисления за счёт распараллеливания. Если на машине имеется как минимум 2 процессора или ядра - чтобы ВИЗУАЛЬНО не тормозил пользоватльеский интерфейс. Принцип работы gui должен ыражаться в том, что пользователь куда-то нажал и сразу же без тормозов получил ответное действие, после чего программа опять уходит в спящий режим до следующего действия пользователя (нажатия на кнопку или мышку). Если реакция на действие имеет долгое время работы, то без потоков на время этой самой работы gui как бы висит. Чтобы этого не было, длительное действие выносят в поток. При этом либо поток сам отобразит свои данные, либо в главном процессе по таймеру происходит событие, которое опрашивает поток, и по его завершении информацию обновляет главный процесс. Во втором случае наличие 2 процессоров/ядер вовсе не нужно, т.к. это не более чем технический приём: операционная система всё равно по очереди исполняет оба потока, но зато не имеем визуальных тормозов. В этом втором случае скорость исполнения из-за наличия потоков практически не изменяется (чуть быстрее на многопроцессорных системах, чуть медленнее на однопроцессорных). Поэтому работать с потоком надо ровно так, как бы ты работал, будь это один процесс: т.е. без всяких sleep'ов. Не говоря уже о том, что скорость прокачки данных по сети на несколько порядков медленнее работы процессора, а потому отправка пакета по сети процессор почти никак не нагружает
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 23.05.2010, 21:23 [ТС] | |
|
Мысль понял... Но, у меня немного структура другая... По нажатию на клавиши я не создаю новый поток, а просто работаю с флагами внутри созданного с момента запуска программы потока, а в нем постоянно опрашиваются эти флаги. В потоке у меня набор функционала под разные задачи, но они вызываются по разным флагам... Например читка файла... Реализована в потоке... я создал этот поток, в него всунул while, чтоб он постоянно работал... в конце while ставлю sleep(1), Вот если читать по 1 кб 1Гб файл и не поставить этот злополучный sleep(1), то проц будет перегружен. Ты понимаешь поток как однократное выполнение каких-либо функций и его закрытие, а я создаю поток (потоки) для их постоянной работы с момента запуска программы.
0
|
|
|
|
||
| 23.05.2010, 22:45 | ||
|
0
|
||
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 23.05.2010, 23:13 [ТС] | |
|
нет, не отправка вызывает перегрузку, а считывание из файла и всякие операции между массивами.
Отправляю по 1045 байт, на приемной стороне может быть 430+615, а как сделать так, чтобы на входе было только по 1045 байт?
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
||||||
| 24.05.2010, 09:29 [ТС] | ||||||
|
Второе предложение было уже о другом)) Извини)
Вот, с клиента на сервер к примеру за один раз отправляю 1045 байт, а на сервере приходят сначала 430 байт, а во второй раз оставшиеся 615 байт. Как сделать так, чтобы не было этих двух раз, а был один и объем принятого сообщения равнялся 1045 байт? Добавлено через 10 часов 13 минут
0
|
||||||
|
|
|
| 24.05.2010, 14:05 | |
|
Для управления потоками передачи данных (не теми потоками, которые создаешь ты) протокол TCP исопльзует специальный алгоритм, именуемый "скользящее окно". Суть его в том, что отправителю не обязательно дожидаться подтверждения приема со стороны получателя всех отправляемых данных. Протоколом TCP формируется подтверждение не для каждого успешно принятого пакета, а для некоторого количества отмечаемого порядковым номером ACK SN. Это количество может в процессе передачи меняться (отсюда и название "скользящее"). Алгоритм сам распределяет количество передаваемых данных, оптимизирует это количестве на основе анализа сети. То есть число переданных пакетов не обязательно сразу будет равно числу принятых пакетов. А ты по моему опять же пытаешься лезть на слишком низкий уровень. И опять же такой "простой" в работе сети не будет и заметен пользователю. Я никак не пойму с чего ты решил, что тормоза в передаче обусловлены именно самим процессом отправки/приема данных. К тому же если ты пользуешься не стандартными классами для чтения файлов, почему не воспользоваться уже разработанными кем-то классами сокетов. В Билдере насколько я могу помнить это TClientSocket и TServerSocket.
0
|
|
|
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
|
|
| 24.05.2010, 20:25 [ТС] | |
|
В билдере есть эти классы, только в линуксе нет... Вот и приходится, чтобы наладить общение между виндой и линуксом, который установлен на микросхеме, работать на таком уровне с сокетами... Чтобы решить свою проблему с разбиением пришлось добавить функцию сегментации, которая собирает все данные приходящие от клиента в пакеты по 1045 байт... иначе никак не получилось... теперь все работает! А тормоза, я же уже писал выше, возникают не из-за передачи данных, а из-за моих слипов в потоках (TThread), которые давали возможность не перегружать процессор машины при непрерывном чтении большого файла... Для чтения из файла, передачи в другой поток этих данных и последующей передачи этого файла я убрал эти слипы, теперь все шуршит. Слипы вновь влючаются, когда программа находится в ждущем режиме или выполняются другие нересурсоемкие операции.
Спасибо за ликбез по TCP)
0
|
|
| 24.05.2010, 21:00 | |
|
Не по теме: Однако, умение грамотно выражать свои мыслит это талант
0
|
|
|
|
|
| 24.05.2010, 23:44 | |
|
fasked, жирный +1.
0
|
|
| 24.05.2010, 23:44 | |
|
Помогаю со студенческими работами здесь
80
Nodejs net socket server and android socket client Windows socket server python + socket client js Socket Android Client and Java Socket Server
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|