![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Agentx86 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Помогите передать и принять структуру по сети. Что надо передавать в полях данные и размер?
struct Contr {short mouse_x; short mouse_y; BYTE action;}; Contr con; send(s,(char*)&con,sizeof(Contr),0); |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Все зависит от того как устроена программа. В чём проблема то? -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
Agentx86 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Все решил сам. Всем спасибо.
|
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Ну тогда пометь тему как решённую.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
witex |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
А ещё лудше покажи, как решил? мне тож интересно!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
drZmeu |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 22.11.2006 Репутация: 1 Всего: 1 |
Да показывай. Всем интересно ;)
![]() --------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code] |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Господа вы меня пугаете
![]() -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
drZmeu |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 22.11.2006 Репутация: 1 Всего: 1 |
![]() Да ладно тебе ptr просто никогда не сталкивались =))) Мне чёт кажется вот так : struct Contr {short mouse_x; short mouse_y; BYTE action;}; Contr con; send(s,con,sizeof(con),0); или так: send(s,con,strlen(con),0); ![]() Ну незнаю я =))) Хотя скоро пригодится =) --------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code] |
|||
|
||||
witex |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
send(s,(constr char*)&con,sizeof(Contr),0); банально! я посмотрел ещё тогда в мсдн и в купил! там же чётко написанно какой тип данных передаётся! тема старая, решённая! если автор забыл поставить галочку о том что тема решена! ненадо её поднимать!
drZmeu , не трогой темы тарые! Это сообщение отредактировал(а) witex - 6.1.2007, 23:30 --------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
Sergio |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Народ помогите и мне передать структуру. Вот что я написал:
Потом:
Какая-то ошибка ![]() И еще вопрос: как принимать структуру? Что чему присваивать? |
||||
|
|||||
drZmeu |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 22.11.2006 Репутация: 1 Всего: 1 |
Я очень извеняюсь что поднимаю старую тему!
С отправкой структуры всё понятно! А вот с приёмом вобшем у мну такойже вопрос как и у Serqio ! И еще вопрос: как принимать структуру? Что чему присваивать?
К примеру я отправил такую структуру на сервер! Как сервер должен разбирать принятые данные??? Тоесть у сервера есть похожая структура:
Как мне присвоить текст в szRecvSt и байт в szByteSt ,,,???,,, ![]() Ещё раз извеняюсь за поднятие старой темы. написал тут чтоб не создавать новую ! --------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code] |
||||
|
|||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: нет Всего: 6 |
Не надо её отправлять целеком! Если в структуре есть сложные элементы, такие как строки, то отправлять её надо по частям, и принимать так же. А если у вас там указатели, сами ведь понимаете такое:
НЕ ПРОКАТИТ! |
|||
|
||||
drZmeu |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 22.11.2006 Репутация: 1 Всего: 1 |
>Не надо её отправлять целеком! Если в структуре есть сложные элементы, такие как строки, то >отправлять её надо по частям, и принимать так же. А если у вас там указатели, сами ведь >понимаете такое:код C++
>1: > send(s,con,sizeof(con),0); > > > > >НЕ ПРОКАТИТ! Ну я почемуто так и думал! Неудобно =\ Вопрост тогда зачем передавать структуру полностью аля:
Если её незя принять и разсортировать??? ![]() --------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code] |
|||
|
||||
Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: нет Всего: 18 |
Почему незя, можно. У тебя 1 Кб + 1 байт передаются. Вполне нормальный размер чтобы передавать его целиком. Потом получаешь (recv) и приводишь буфер к твоему типу. -------------------- Подпись больше не нужна |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Прежде чем что-либо (структуру, класс ...) передавать по сети, нужно вначале это что-то сериализовать.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
drZmeu |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 22.11.2006 Репутация: 1 Всего: 1 |
А можно примерчик
![]() А то у меня уже мозги закипают ![]() --------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code] |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
У меня вопрос. Может ли команда recv разбить принимаемую структуру на несколько частей. Например, я точно знаю, что сервер мне послал 10 байт. Может ли первый вызов recv вернуть меньше 10? Я пока от неуверенности , пользую эту функцию
|
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Да, recv возвращает только то, что пришло на данный момент. Поэтому количество байт может быть не больше того, что было затребовано.
P.S. если хочешь задать какой-нибудь вопрос, то лучше для этого создавать новую тему. Тем более что вопрос никак не связан с текущей темой. Это сообщение отредактировал(а) ptr - 6.6.2007, 15:11 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
intel |
|
||||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
После тово как получил структуру по сокету и запихал её в буфер, хочу привести тот самый буфер к типу структуры,
но компилятор кричит "так не пойдёт". Не пойму где я там касяк спорол Вот кусок кода:
А вот мой тип (подключаю в голове):
Спасибо |
||||
|
|||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
((Data*)&buf)->x
|
|||
|
||||
intel |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
Спасибо leniviy, всё получилось
|
|||
|
||||
intel |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
Вот ещё небольшая проблемка.
по сокету отправляю структуру в сторону клиента, но тот ничего не получает, хотя блок else выполняется. В структуре int и указатель на char. Вообщем вот кусок от server'а:
А вот от клиента:
Ну и моя структура до кучи:
Вот что выходит на консоль (у клента):
Сдаётся мне там чтото с char'ом не то... |
||||||||
|
|||||||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 1 Всего: 158 |
правильно сдается - ты пересылаешь указатель на строку, а не саму строку.
структура должна быть примерно такого вида:
и при получении надо учитывать тот момент, что данные, отосланные одним вызовом send, вовсе не обязательно придут одним куском - вполне возможно их нужно будет читать несколькими вызовами recv. |
|||
|
||||
intel |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 5.7.2007 Репутация: нет Всего: нет |
Спасибо dumb, скопировал твой предложенный вариант, заработало как по маслу,
вот тока не въеду што значят #pragma pack(push,1) и #pragma pack(pop)? В гугле ничево не нарыл, поясни если не затруднит |
|||
|
||||
Artemon |
|
|||
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 1 Всего: 20 |
Все так весело передают структуры по сокетам, даже не задумываясь о выравнивании струкуры в памяти.
Только лишь dumb не стал этим принебрегать (на то он и эксперт). #pragma pack(push,1) - отменяет выравнивание. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
Комрады если уж сыр - бор про передачу инфы через сокеты - то как насчет юзанья структуры WSANETWORKEVENTS. А именно что бы сохранить инфу от сервера на клиенте скажим хотя бы в файл. Кто нибудь посоветует что нибудь? Пжаста!
Это сообщение отредактировал(а) mrbrooks - 20.9.2007, 15:15 |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 1 Всего: 158 |
||||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: нет Всего: 306 |
TCP/IP |
|||
|
||||
Skladnoy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 13.9.2007 Репутация: нет Всего: нет |
||||
|
||||
BasilL |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 26.5.2005 Где: Челябинск обл. Репутация: нет Всего: 1 |
Приветствую!
Не стал создавать новую тему - спрошу здесь имеем структуру
передаем
принимаем
все передается и принимаеться нормально. Но далее происходит вот что
Как только выполнение программы приходит на строку с if ((MsgRecv.MsgType) == "0100") условие срабатывает... Хотя в принятом MsgRecv.MsgType = "0004"... Смотрю в отладчике - да, все принимается ок, MsgType = "0004". Программа переходит на строку с проверкой условия - и MsgType становится равно "0100".... Пробовал менять значения в условии - что бы ни поставил, всегда MsgType становится равным ему... Как будто в if-е не "==" стоит, а "=".... В чем может быть дело? Это сообщение отредактировал(а) BasilL - 12.12.2008, 23:11 |
||||||||
|
|||||||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
имхо нельзя передавать борландовские строки через сокет. В дельфях это встроенный тип, в C++ скорее всего смарт поинтер, указатель на данные. А сами данные строки находятся в другой области памяти и не передаются.
здесь явное нарушение безопасности типов. Странно, что потом не выскакивает Access violation, но ничего, потом выскочит ![]() Хотите передать 3 строки за раз, придётся сначала перевести строки в char* , PChar или PAnsiChar потом скопировать все 3 строки друг за другом в 1 блок памяти и передавать этот блок целиком. С помощью "C" структур так сделать нельзя, потому что только последнее поле структуры может иметь вариабельный размер. Я бы сделал по-другому, написал 2 функции: sendMessage() и recvMessage() похожие на send() и recv() , только вместо аргументов buf и length аргумент типа Message. внутри этих функций 3 раза (для MsgType,MsgIP и MsgText) вызываются соответственно sendString() и recvString() в sendString() в сокет сначала посылаете 4 байта (длину строки ) потом данные типа Pchar в recvSring() из сокета сначала читаете 4 байта (длину строки , len ) потом !в цикле! читаете в буфер типа PChar и не забывайте, что может понадобиться несколько вызовов recv, чтобы прочитать всю строку. Выставляете нолик в последнем байте буфера (buf[len]) и конвертируете PChar обратно в AnsiString Это сообщение отредактировал(а) leniviy - 13.12.2008, 01:10 |
|||
|
||||
BasilL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 26.5.2005 Где: Челябинск обл. Репутация: нет Всего: 1 |
leniviy,
т.е. если я правильно понял - возможен такой вариант решения: изменить структуру Message так, чтобы только последнее поле имело непостоянный размер, например так
на крайняк, можно и последнее поле запихнуть в какойнить char[256]... но не хотелось бы Верна идея? |
|||
|
||||
leniviy |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Всё равно одновременное использование AnsiString как поля структуры +
не сработает. можно так:
но тогда надо и другие части проги менять:
Сложно? Конечно. Потому лучше сделайте, как я посоветовал в пред. посте. Оставьте структуру, как была, но напишите 2 функции для передачи/приёма такой структуры и 2 функции для передачи/приёма AnsiString |
||||||||||
|
|||||||||||
BasilL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 26.5.2005 Где: Челябинск обл. Репутация: нет Всего: 1 |
leniviy, спс за советы... у самого есть еще пара мыслей - на выходных поковыряю ))
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
скорее класс-оболочка над char массивом а как иначе вы предлагаете использовать recv? другой вопрос в несоответствии кол-ва принимаемых данныы размерам структуры в C++ массивы нулевой длины не разрешены |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
||||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
это не имеет отношения к конкретному компилятору отступление от стандарта - потенциальный баг |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |