Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325

Прием структуры через сокеты

08.10.2014, 22:48. Показов 4176. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день, пытаюсь передать структуру через сокет
вот структура
C++
1
2
3
4
5
6
struct ForSend //structure for sending data to the server
  {
      int choise;
      char *ReturnAddr;
      std::string NameFile;
  };
отправляю вот так
C++
1
2
int len=sizeof (Client);
        send(CreateClient,(char *)&Client,len,0);
непойму как нужно считывать эти данные на сервере? пробывал вот так
C++
1
2
3
4
5
6
7
 int n;
    struct c {     
      int choise;
      char *ReturnAddr;
      std::string NameFile;
  }; 
    recv(NS,c,n,0);
ну как-то без успешно, полазил по интернету как-то ненашол решения, кто знает подскажите пожалуйста и как мне потом на сервере можно будет обращатся к тем полям?
C++
1
c.choise
или нет?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2014, 22:48
Ответы с готовыми решениями:

Сокеты. Прием данных клиентом от сервера
Здравствуйте. Задача такая: Клиент отправляет серверу данные, сервер, исходя из полученных данных, обращается к БД, результат запроса нужно...

Сокеты через роутер
Добрый день. Вопрос следующий: есть роутер, имеющий белый IP X.X.X.X. Настройкой роутера через порт Y в инет прокинут комп (удаленнка...

Обмена информации через сокеты
Здравствуйте, уважаемые форумчани. Пожалуйста, помоги сделать эту задачу: В среде Visual C++ написать клиентскую и серверную программы...

13
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
08.10.2014, 22:54
итернал, ни указатели, ни std::string не имеет смысла передавать на удаленную машину, т.к. они там не имеют смысла и будут указывать в космос. Передавать можно только структуры со статическими полями. Строки -- в виде массивов символов. И обязательно ознакомитесь с этим (оно хоть подано в контексте стандартных классов Delphi, но одинаково касается любого языка, от Ассемблера до Джавы.).
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
08.10.2014, 22:57  [ТС]
строчку не захватил, ну в отправке
C++
1
2
3
  ForSend Client;
        int len=sizeof (Client);
        send(CreateClient,(char *)&Client,len,0);
Добавлено через 1 минуту
Цитата Сообщение от quwy Посмотреть сообщение
итернал, ни указатели, ни std::string не имеет смысла передавать на удаленную машину, т.к. они там не имеют смысла и будут указывать в космос. Передавать можно только структуры со статическими полями. Строки -- в виде массивов символов. И обязательно ознакомитесь с этим (оно хоть подано в контексте стандартных классов Delphi, но одинаково касается любого языка, от Ассемблера до Джавы.).
ок, исправлю, но всеравно если взять во внимание что там не строка и не указатель, как тогда?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
08.10.2014, 23:33
Цитата Сообщение от итернал Посмотреть сообщение
как
шлите каждое из полей отдельно
C++
1
2
3
send(CreateClient,Client.choise,sizeof(Client.choise),0);
send(CreateClient,Client.ReturnAddr,strlen(Client.ReturnAddr),0);
send(CreateClient,Client.NameFile.c_str(),NameFile.size(),0);
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
08.10.2014, 23:53  [ТС]
вот засада)) а за 1 раз не как? ну просто по одному я то и сам знал как, и в моем случае 3 штуки отправить не проблема, тогда можно без структуры обойтись, просто перемеными, хочется как-то сразу кучей
0
2 / 2 / 2
Регистрация: 27.09.2014
Сообщений: 15
09.10.2014, 12:46
Так ить судя по названиям функций (send и recv) используется TCP протокол. А он потоковый, а не пакетный.
То-есть, послав функцией send скажем две структуры подряд, я не смогу их разделить на удаленном конце.
Функция recv вернет мне например 1.5 + 0.5 либо вообще 2 структуры сразу.
Чтобы четко на другом конце иметь то что посылал, надо пользоваться пакетным протоколом, то есть UDP.
Перейти от TCP к UDP несложно, будут только другие функции - sendto и recvfrom.
Однако, в отличие от TCP, протокол UDP не гарантирует доставку данных.

И вот тут вопрос к гуру - а что, не изобрели еще такой протокол чтобы :
1.Был пакетным как UDP
2.Гарантировал доставку как TCP
3.Желательно чтобы он работал и под Windows XP ?

Если изобрели, то покажите пожалуйста хотя бы как создать на нем сокет.
Для примера привожу создание сокета UDP :
s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP, 0,0,0); - вот что-то такое и напишите пожалуйста.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
09.10.2014, 12:51  [ТС]
это мне вопрос? я помоему просто спросил как на сервере считать данные со структуры которую я передаю, пусть это будет не что я написал, а например
int a
int b
inc c
ну или же char и все
непойму смысла твоего сообщения
0
2 / 2 / 2
Регистрация: 27.09.2014
Сообщений: 15
09.10.2014, 12:57
Да не, просто у меня те же проблемы, пусть ответит кто-нибудь кто знает.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
09.10.2014, 13:19  [ТС]
ну будем ждать)
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
09.10.2014, 15:42
Цитата Сообщение от ivborodin62 Посмотреть сообщение
И вот тут вопрос к гуру - а что, не изобрели еще такой протокол чтобы : 1.Был пакетным как UDP 2.Гарантировал доставку как TCP
Не существует.
А что, так уж трудно разработать свой прикладной протокол поверх TCP? Например:
- первые четыре байта (sizeof(int) на 32-битной платформе) - общий размер последующих "осмысленных данных" в байтах,
- далее шлем "осмысленные данные" - любые. Например, как предлагали уже в этой ветке.
Вуаля! Распарсить TCP поток по данной схеме не просто, а очень просто
0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
09.10.2014, 15:48
Цитата Сообщение от CheshireCat Посмотреть сообщение
- первые четыре байта (sizeof(int) на 32-битной платформе) - общий размер последующих "осмысленных данных" в байтах,
- далее шлем "осмысленные данные" - любые. Например, как предлагали уже в этой ветке.
Только ограничить аппетиты принимающей стороны не забываем, а то "ложится" такая реализация протокола в два счета.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
09.10.2014, 16:26  [ТС]
Цитата Сообщение от CheshireCat Посмотреть сообщение
А что, так уж трудно разработать свой прикладной протокол поверх TCP? Например:
- первые четыре байта (sizeof(int) на 32-битной платформе) - общий размер последующих "осмысленных данных" в байтах,
- далее шлем "осмысленные данные" - любые. Например, как предлагали уже в этой ветке.
так отправку я вроде понимаю, я немогу разобратся с принимающей стороной, как мне там работать, ну всмысле там надо тоже создавать структуру? или как буду приниматся данные?
C++
1
2
3
4
5
6
7
int n;
    struct c {     
      int choise;
      int b;
      int a;
  }; 
    recv(NS,c,n,0);
и как потом можно будет обращатся с этим переменным? c.a?
0
2 / 2 / 2
Регистрация: 27.09.2014
Сообщений: 15
09.10.2014, 17:35
//чисто формально, не трогая проблемы TCP / UDP
struct mystruct { //описание структуры
int choise;
int b;
int a;
};
char buf[1000]; //буфер
mystruct c; //экземпляр структуры
отправим его просто как массив char :
send(s,(char*)(&c),sizeof(mystruct),0);
Или переписать в буфер, а потом отправить :
memcpy(buf,&c,sizeof(mystruct));
send(s,buf,sizeof(mystruct),0);

На приемной стороне
recv(s,(char*)(&c),sizeof(mystruct),0);
Или принять в буфер и переписать :
recv(s,buf,1000,0);
memcpy(&c,buf,sizeof(mystruct));
1
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
09.10.2014, 17:40  [ТС]
Цитата Сообщение от ivborodin62 Посмотреть сообщение
struct mystruct { //описание структуры
int choise;
int b;
int a;
};
char buf[1000]; //буфер
mystruct c; //экземпляр структуры
отправим его просто как массив char :
send(s,(char*)(&c),sizeof(mystruct),0);
Или переписать в буфер, а потом отправить :
memcpy(buf,&c,sizeof(mystruct));
send(s,buf,sizeof(mystruct),0);
На приемной стороне
recv(s,(char*)(&c),sizeof(mystruct),0);
Или принять в буфер и переписать :
recv(s,buf,1000,0);
memcpy(&c,buf,sizeof(mystruct));
ну вот выполнилось
recv(s,(char*)(&c),sizeof(mystruct),0);
как работать с тем что передали?
&c это должно быть тоже структура с таким же количеством полей как и в отправке? и тогда каждое поле будет соответсвывать принятому значению?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2014, 17:40
Помогаю со студенческими работами здесь

Передача файла через сокеты
Добрый вечер. Столкнулся с задачей, которая звучит так: написать клиент-серверное приложение, которое организует передачу файла с сервера...

Передача файла через сокеты
Столкнулся со следующей проблемой: передаю файл с клиента на линуксе на сервер на винде. Файл передается через буфер 1кб, чтение/запись...

Сокеты через Ws2_32.dll
Есть ли у кого работающий пример гет запроса на какой-нибудь сайт ? В нэте всё в DEV-C++ не работает,а знаний что-либо исправить не...

Создание клиента через сокеты
Ниже приведен код при компиляции которого получил несколько сообщений об ошибках. #include <WinSock2.h> #include...

HTTP запрос через сокеты
Делаю HTTP GET-запрос к google.com "GET / HTTP/1.1\r\n" "Host: www.google.com\r\n" "Accept:text/html;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru