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

Socket: Client & Server

11.05.2010, 22:15. Показов 16772. Ответов 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
15.05.2010, 15:17  [ТС]
Студворк — интернет-сервис помощи студентам
Пытаюсь на сервере сделать так, чтобы в while сделать проверку на подключение клиента, т.е. чтобы на accept не было блокировки. Пытаюсь сделать через select, т.е.:
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (res<=0)
{
   FD_ZERO (&read_s); // обнуляю множесто
   FD_SET (new_sock,&read_s); //заношу в него мой сокет
   time_out.tv_sec=0;
   time_out.tv_usec=0; //без тайм-аута
   if (SOCKET_ERROR==(res=select(0,&read_s,NULL,NULL,&time_out))) 
   {
       err_msg("Error");
       continue;
   }
}
Но даже при подключении клиента продолжает крутиться while. Не могу понять почему.

Добавлено через 22 минуты
Извините за попрос, ошибся сокетом, который добавлял в множество, добавлял дескриптор сокета, который образовывался в accept, а должен был, который в listen. Все равно спасибо
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.05.2010, 15:42
Ответ, как мне кажется, в том, что в select'е у тебя указано бесконечное время, а потому res всегла будет равен единице (потому как в этом случае из select'а выйдем только тогда, когда в сокет постучится клиент)
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
15.05.2010, 23:48  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Ответ, как мне кажется, в том, что в select'е у тебя указано бесконечное время, а потому res всегла будет равен единице (потому как в этом случае из select'а выйдем только тогда, когда в сокет постучится клиент)
нет, это не так, на практике это говорит о том, что в select после однократной проверки не будет задержки на ожидание клиента
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
16.05.2010, 17:32  [ТС]
Очередной вопрос:
если надо отправить на сервер файл с настройками размером несколько мб, необходимо ли его нарезать, или просто считать в буфер такого размера, и этот буфер отправить на сервак? Необходима спец. подготовка этого файла?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.05.2010, 18:21
Файл слать нельзя. Слать можно только набор байтов, а дальше на уровне своего протокола уровня приложения ты эти байты будешь превращать в файл.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
16.05.2010, 18:37  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Файл слать нельзя.
сокет сам согласно протоколу нарезает файл на контенеты который поочереди потом отправляет?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
16.05.2010, 18:44
Цитата Сообщение от sitesv Посмотреть сообщение
сокет сам согласно протоколу нарезает файл на контенеты который поочереди потом отправляет?
файл должен нарезать ты сам и последовательно отправлять пачками.
то есть необходимо читать файл в какой-либо буфер последовательно и этот буфер отправлять.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
16.05.2010, 18:45  [ТС]
fasked, СПАСИБО!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
16.05.2010, 19:15
Цитата Сообщение от sitesv Посмотреть сообщение
сокет сам согласно протоколу нарезает файл на контенеты который поочереди потом отправляет?
Сокет принимает и отправляем байты. Больше он ничего не делает. А как трактовать байты - это уже должна разбираться программа в соответствии своему протоколу прикладного уровня (который ты сам должен придумать для своей программы)
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
16.05.2010, 19:42  [ТС]
А какой максимальный блок данных можно передать за однократную передачу?
0
98 / 94 / 16
Регистрация: 16.05.2010
Сообщений: 310
16.05.2010, 19:46
А по чему бы не использовать средства NetBios'а. Очень удобно: нужно просто знать имя ПК в DNS и номер соединения (по умолчанию - 1). А для синхронизации использовать средства распараллеливания процессов MPI или PVI (параллельное программирование, легко можно найти ссылки). Для несложных задач вполне хватит.

Пример использования в тхт
Вложения
Тип файла: txt LAB4_F.txt (1.8 Кб, 34 просмотров)
Тип файла: txt LAB4_S.txt (2.0 Кб, 30 просмотров)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
16.05.2010, 19:50
Цитата Сообщение от sitesv Посмотреть сообщение
А какой максимальный блок данных можно передать за однократную передачу?
много, но думаю не больше чем максимальное для INT
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
16.05.2010, 20:14  [ТС]
Цитата Сообщение от IchMors Посмотреть сообщение
А по чему бы не использовать средства NetBios'а?
А под Linux будет работать?
0
98 / 94 / 16
Регистрация: 16.05.2010
Сообщений: 310
16.05.2010, 20:18
Не знаю. но почему бы не попробовать, если что использовать аналоги библиотек для линукса (для винды это nd, ncmd.h).
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
17.05.2010, 12:55  [ТС]
Непонятки при передачи файла.
В клиенте открываю файл, нарезаю на куски (N-число кусков) к примеру по 102400 байт, отслеживаю остаток.
В цикле отпавляю по кускам.

Код клиента:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     sets_pos_in_fileread=0;
     for (int i=0;i<N;i++)
     {
           if ((len_file_set-sets_pos_in_fileread)>=MAX_PACKET_SIZE)
           {
              sets_pos_in_fileread+=FileRead(h_file_set,&buff[0],MAX_PACKET_SIZE);
              if (SOCKET_ERROR == send (s, (char* )&buff,MAX_PACKET_SIZE,0) )
              {
                       err_msg("send",1);
                       return;
              }
           }
           else
           {
              ZeroMemory(&buff[0],MAX_PACKET_SIZE);
              FileRead(h_file_set,&buff[0],(len_file_set-sets_pos_in_fileread));
              if (SOCKET_ERROR == send (s, (char* )&buff,(len_file_set-sets_pos_in_fileread),0) )
              {
                       err_msg("send",1);
                       return;
              }
      }
Перед отправкой кусками файла на сервер, я отправляю на него число кусков N, чтоб столько же и принять в цикле.
Код сервера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
check_number_flag=N
while(set_idx_buff!=(check_number_flag))
{
           FD_ZERO (&read_s); // Обнуляем мнодество
           FD_SET (new_sock, &read_s); // Заносим в него наш сокет
           time_out.tv_sec = 0;
           time_out.tv_usec = 0;
           if (SOCKET_ERROR == (res = select (0, &read_s, NULL, NULL, &time_out))) {/*err_msg("select read",1);*/ continue;}
           if (res!=0 && FD_ISSET(new_sock, &read_s))
           {
                    if (FAILED (msg_len=recv(new_sock,(char*)&buff,MSG_LEN,0))) {continue;}
                    FileWrite(h_rec,buff,msg_len);
                    set_idx_buff++;
           }
            Sleep(1);
}
По сути, переменная set_idx_buff должна равняться числу кусков N. Но ситуация с большими файлами бывает неоднозначной, грубо говоря переменная set_idx_buff достигла числа N и вышла из while, а на клиенте еще не все данные отправлены. Как такое может быть, никак не могу это понять!! Прибавлял в While() к check_number_flag числа, для проверки, при каком же значении set_idx_buff файл полностью принимается, в итоге оказываются разные варианты... HELP!

Добавлено через 1 час 42 минуты
Обнаружил, что, к примеру, отправляя за раз 100 кб, на приемной стороне за один раз можно принять 10 кб, а за вторую итерацию приема - оставшиеся 90 кб.

Но назрел другой вопрос: еще не отправляя с клиента, а принимая на сервере, длина сообщения неотправленных данных !будет равна какому-то значению, что означает , что в очереди что-то осталось...
Во второй итерации приема будет уже -1. А как обнулить эту очередь? Есть какие-нибудь операторы обнуления? чтобы и в первый раз выводилось -1 ?

Добавлено через 1 час 29 минут
Проведя ряд экспериментов, выяснил, что число входных байт, получаемое вначале, сигнализировало о том, что за recv из другой функции я принял не все данные. Вот и весь фокус оказался))
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
17.05.2010, 12:57
Цитата Сообщение от sitesv Посмотреть сообщение
Проведя ряд экспериментов, выяснил, что число входных байт, получаемое вначале, сигнализировало о том, что за recv из другой функции я принял не все данные. Вот и весь фокус оказался))
Можешь мне одну вещь объяснить? Почему ты, прежде чем попытаться самому хоть как-то отладить свою программу, сразу же бежишь на форум и пытаешься свои проблемы переложить на других?
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
17.05.2010, 13:19  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Можешь мне одну вещь объяснить? Почему ты, прежде чем попытаться самому хоть как-то отладить свою программу, сразу же бежишь на форум и пытаешься свои проблемы переложить на других?
Потому что изначально не было уверенности, что эксперименты увенчается успехом, может кто-то что-то изначально мог и подсказать, если сталкивался с подобными ситуациями.

А что, подобные сообщения настолько перегружают мозг "форумчан", что стоит такое спрашивать? Тут же все просто, нет желания отвечать на обозначенные проблемы или просто не в курсе дел - берешь и пропускаешь это сообщения...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
17.05.2010, 14:43
Нет, не перегружают. Только у многих к подобным вопросам отношение такое: если видят, что человек действительно сам пытается в чём-то разобраться, то если могут, то помогут. А вот когда видно, что человек на каждый чих у всех всё спрашивает, то помогать таким людям нет никакого желания. Т.е. в такой ситуации ты оказываешься сам себе злобный буратино
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
17.05.2010, 14:50  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Нет, не перегружают. Только у многих к подобным вопросам отношение такое: если видят, что человек действительно сам пытается в чём-то разобраться, то если могут, то помогут. А вот когда видно, что человек на каждый чих у всех всё спрашивает, то помогать таким людям нет никакого желания. Т.е. в такой ситуации ты оказываешься сам себе злобный буратино
Принял к сведению напутствие :-)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.05.2010, 18:31
Не знаю в чем у тебя проблема, но я обычно отправлял файлы так:

Отправитель.
1. Узнаем размер файла.
2. Вычисляем количество полных чтений в буфер
C++
1
size_t amount = file_size / buffer_size;
3. Вычисляем количество остаточных байт (соответственно не кратные размеру буфера)
C++
1
size_t bmount = file_size % buffer_size;
4. После вычислений размеров начинаем работу с файлом. Для начала читаем и отправляем байты, которые целиком помещаются в буфер:
C++
1
2
3
4
5
for(int i = 0; i < amount; ++i)
{
   fread(); // этой командой читаем из файла buffer_size байт в буфер
   send(); // этой отправляем buffer_size байт присоединенному сокету
}
5. далее работаем с остаточным числом байт
C++
1
2
3
4
5
if(bmount)
{
   fread(); // здесь bmount байт читается в буфер
   send(); // здесь отправляется bmount байт
}
6. файл отправлен

С приемником же все попроще, так как функция recv возвращает количество принятых байт - поступаем следующим образом
C++
1
2
3
4
while((nbytes = recv()) > 0)
{
   fwrite(); // записываем nbytes принятых байт в файл
}
PS. Это только алгоритм, а не готовый код само собой, в комментариях я указал какая функция, что должна делать, а ты уже сам подставь нужные.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2010, 18:31

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;; ...


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

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