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

Socket: Client & Server

11.05.2010, 22:15. Показов 16174. Ответов 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
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, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru