![]() |
|
Модераторы: bsa |
![]()
|
|
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
сообщение передаваемое в сокет состоит из двух частей:
Скажите пожалуйста как это лучше сделать Заранее спасибо |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Создай структуру, и ее передавай.
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
Я так и делал,
но со структурой приходит несколько символов, а должно быть явно больше, идеальным для меня было бы передача в формате вектор <char> но немогу сконвертировать структуру хотя бы в char |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
knopka, ты бы код выложил. Достаточно твоего буфера и функций send(), recv().
|
|||
|
||||
| REZiaMIX |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Должно быть приблизительно так(в полупсевдокоде
Или более гибкий вариант:
При передаче строки надо учитывать что она прийдет без \0. Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 10:13 -------------------- ![]() |
||||
|
|||||
| knopka |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
to REZiaMIX
Спасибо за помощь.
а как обработать ответное сообщение? вид сообщения: �▒��趣��pW�������� первые четыре это len? а остальные string как их извлечь из буфера? Добавлено через 6 минут и 2 секунды а после отправки надо делать
|
||||
|
|||||
| REZiaMIX |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
len - длина поля string , без нулевого символа.
Тут делаем с a.string что надо (но учесть что она без '\0')
Да , надо. Объясню поподробней. В гибком варианте идет расчет , что при получении пакета мы сначала считаем len, len - длина поля string , без нулевого символа. А потом считываем len байтов , в итоге получим все ,что было отправлено. То что я написал - просто для наглядности и понятия что надо делать. Приблизительный код будет таким , но тк я не тестировал возможны ошибки. Просто надо понять что структура пакета: len char 4 байта len*char байтов Поле len вноситься чтобы сервер знал , какой длины сообщение string. При этом клиент должен соответственно заполнять поле len длиной string Сам до конца не понял , но наверное надо использовать для структур правильное выравнивание , иначе возможны ошибки:
Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 15:06 -------------------- ![]() |
||||||||||||||
|
|||||||||||||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
В том и загвоздка , что вопрос я упростил вопрос.
len у меня в задаче хранит всю длинну сообщения включая несколько полей uint и string |
|||
|
||||
| REZiaMIX |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
А зачем хранить длину полей фиксированной длины?
Здесь мы должны знать len, чтобы считать string, а: адрес val1 = sizeof(len)+ len; val2 = sizeof(len)+ len + sizeof(val1); Простая арифметика) Это сообщение отредактировал(а) REZiaMIX - 17.11.2008, 16:07 -------------------- ![]() |
||||
|
|||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
а разве len это не длинна поле string? мы ведь нигде не добавляем к длинне сообщения ещё и размер самого поля uint Добавлено через 2 минуты и 58 секунд А если структуру преобразоватьв vector это не упростит задачу? Добавлено через 11 минут и 19 секунд С адресами я понял, а как из буфера (char*)&a прочитать значение для первого поля структуры? |
|||
|
||||
| REZiaMIX |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
len - длина поля string , уже писал. передавать vector думаю не лучшая идея a - обычная структура , с ней и работать надо как со структурой)
-------------------- ![]() |
||||||||
|
|||||||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
то есть при приёме
структура будет заполнена автоматически? |
|||
|
||||
| REZiaMIX |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Все поля , которые имеют неопределенный размер(в нашем случае string) надо както отдельно обрабатывать. Опечатка , там точка:
Тут мы получим размер поля , для последующего считывания string. далее считаем string
Если в структуре все поля имеют фикс. размер , то:
Автоматически заполнит всю структуру. -------------------- ![]() |
||||||||||
|
|||||||||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
Чё -то сообщение пустое
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Чье? -------------------- ![]() |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
knopka, если пишешь на С++, то можно сделать примерно так:
|
|||
|
||||
| knopka |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
to REZiaMIX
от сервера на сервере обработка эхом
стандартное построение классов Socket - ClientSocket - SimpleClientMain а в клиенте после приема ответ все поля у структуры а пустые |
||||
|
|||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
to bsa
не нашёл описания
я так понимаю преобразует тип поля в <char*>? а нельзя как то посимвольно перечитать структуру в вектор? (в смысле конвертировать) буду пробовать и этот вариант |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
А зачем посылать 3 инта отдельно?) -------------------- ![]() |
|||
|
||||
| REZiaMIX |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Дабы закончить эту тему:
Сервер:
Клиент:
Писал на коленках , но компилируется и работает 100%. Клиент посылает 3 числа и строчку. Сервер увеличивает числа на 1 , меняет строчку и отвечает. -------------------- ![]() |
||||
|
|||||
| knopka |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
to REZiaMIX
спасибо только не пойму где компилить судя по
в винде, попробовал в CodeBlocks и в VisualStudio ошибки и ещё вопрос
почему два раза посылаем, сначала цифры а потом строку? Добавлено через 14 минут и 17 секунд to REZiaMIX Я Вас наверно уже достал ну ещё вопрос А в Linux есть альтернатива
|
||||||||
|
|||||||||
| REZiaMIX |
|
||||||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
conio.h используется для _getch(); можно заменить чемнить другим и избавиться от заголовка.
Т.к. string в данном случае в структуре - указатель на 0 символ строки. Если послать структуры целиком , то вместо строки пошлем указатель на нее , что не верно. Сначала посылаем 3 инта структуры(val1,val2,val3) + uint(len)
потом посылаем строку.
Наверное не правильный выход , но прокатит это:
Вообще в никсах посмотри описание WSAStartup и подгони тип данных. Это сообщение отредактировал(а) REZiaMIX - 19.11.2008, 12:10 -------------------- ![]() |
||||||||||||||||||
|
|||||||||||||||||||
| bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
||||||||
|
|||||||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
Большое спасибо to REZiaMIX и bsa очень помогли вопрос закрыт
|
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Хм , ну если здесь пишем клиент , то выравнивание задать можем , значит можем быть уверенны) Вообще , нужно знать что нужно знать протокол клиент<->сервер , чтобы таких вопросов не возникало) Думаю в данном случае оба решения подойдут) -------------------- ![]() |
|||
|
||||
| knopka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 187 Регистрация: 17.1.2006 Где: Россия: Петербург Репутация: нет Всего: 1 |
ДА оба подходят
|
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
все вышенаписанное для TCP соединения на прием работать НЕ БУДЕТ
т.к. фрагментация |
|||
|
||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Хм , поясни , у меня все работает как ни крути -------------------- ![]() |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Кстати, мой вариант работать точно не должен - в описании recv написано, что в случае если полученные данные не помещаются в буфер - излишек теряется. Таким образом действительно надо делать все через вектор...
|
|||
|
||||
| J0ker |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
ну просто пока везет данные, отправленные через TCP могут приходить как угодно фрагментированные, даже если были отправлены через send одним куском recv заполняет буфер только тем, что пришло на данный момент Добавлено через 1 минуту и 33 секунды
это верно только для UDP пакетов для TCP ничего не теряется Это сообщение отредактировал(а) J0ker - 21.11.2008, 18:50 |
||||||
|
|||||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
В данном случае просто рассматривается логика протокола(т.е. все в идеальном состоянии) , а фрагментирование это уже другой разговор. -------------------- ![]() |
|||
|
||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
фрагментация относится как раз к логике протокола TCP идеального состояния тут не существует - фрагментация может быть даже на локальной машине |
||||
|
|||||
| REZiaMIX |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: 1 Всего: 4 |
Идеально состояние - нет потери пакетов , отсутствие фрагментации , но тут суть в том. Если вместо вызова recv подставить функцию , обеспечивающую склейку пакетов и тд , то этот подход будет работать как надо в любых предусмотренных случаях P.S. Сотый пост) Это сообщение отредактировал(а) REZiaMIX - 23.11.2008, 11:55 -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |