-
у меня была прога в которой одно значение вводимое с едита формировалось в пакет и передовалось по UDP протоколу,а теперь надо чтобы передовалось три значения,как это реальзовать в моём случае?
void __fastcall TForm1::Button1Click(TObject *Sender) {
// char tBuf[5] = {0x55,0x56,0x57,0x58,0x59}; char Buffer[255]; char * tBuf; char *lBuf; char * mBuf; char * pBuf; char * wBuf; char * dBuf; char Answer[255]; int iKount, i, ClearCount, err; AnsiString S, St, Se, S2, S3, str, Estr; ClearCount = 0;
tBuf = new char[ (Edit2->Text.Length() * 0,5) + 1 ]; strcpy( tBuf, Edit2->Text.c_str() );
lBuf = new char[ (Edit3->Text.Length() * 0,5) + 1 ]; strcpy( lBuf, Edit3->Text.c_str() );
mBuf = new char[ (Edit4->Text.Length() * 0,5) + 1 ]; strcpy( mBuf, Edit4->Text.c_str() );
sockaddr_in anAddr; anAddr.sin_family = AF_INET; anAddr.sin_port = htons(PORT); anAddr.sin_addr.S_un.S_addr = inet_addr(cp);
//îáìåí ñîîáùåíèé ñ ñåðâåðîì // óñòàíîâêà âîçìîæíîñòè àäðåñà if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1) { Memo1->Lines->Add("Error setting broadcast socket"); WSACleanup(); return; } HOSTENT *hst; sockaddr_in dest_addr; memset(&dest_addr, 0, sizeof(sockaddr_in)); dest_addr.sin_family=AF_INET; dest_addr.sin_port=htons(PORT);
// îïðåäåëåíèå IP-àäðåñà óçëà if (inet_addr(cp)) dest_addr.sin_addr.s_addr=inet_addr(cp); else if (hst=gethostbyname(cp)) dest_addr.sin_addr.s_addr=((unsigned long **)hst->h_addr_list)[0][0]; else { Memo2->Lines->Add("Íåèçâåñòíûé õîñò: " + IntToStr(WSAGetLastError())); closesocket(s); WSACleanup(); return; }
// Ïåðåäà÷à ñîîáùåíèé íà ñåðâåð iKount = sendto(s, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in)); if (iKount) {
for(i = 0; i < strlen(tBuf); i++)
{ St = S.sprintf("%0.2X",tBuf[i]); S3 += St + " "; } Memo2->Lines->Add(""); Memo2->Lines->Add("Ïåðåäàíî áàéò " + IntToStr(iKount)); Memo2->Lines->Add( Edit2->Text); Memo2->Lines->Add( Edit3->Text); Memo2->Lines->Add( Edit4->Text); //Memo2->Lines->Add(S3);
-
> у меня была прога в которой одно значение вводимое с едита > формировалось в пакет и передовалось по UDP протоколу,а > теперь надо чтобы передовалось три значения
Три раза передать по одному?
-
нет,одновременно ,в одном пакете
-
по отдельности я уже передовал,а мне надо один заходом
-
У меня Эдит1,Эдит2,Эдит3 ,я ввожу туда данные(слова,цифры) отправить надо в одном покете,не по отдельности,а одновременно.Звеняйте за тавтологию
-
Этом коде передается в пакете только с первого Эдита tBuf = new char[ (Edit2->Text.Length() * 0,5) + 1 ]; strcpy( tBuf, Edit2->Text.c_str() );
вот iKount = sendto(s, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
а у меня ещё есть
lBuf = new char[ (Edit3->Text.Length() * 0,5) + 1 ]; strcpy( lBuf, Edit3->Text.c_str() );
mBuf = new char[ (Edit4->Text.Length() * 0,5) + 1 ]; strcpy( mBuf, Edit4->Text.c_str() );
а как сделать чтобы одим пакетом все 3 параметра отправились не знаю.
-
> west19 (08.10.13 16:52) [2] > нет,одновременно ,в одном пакете
Ну в одном пакете или не одном решать не тебе, а операционной системе, но в принципе можешь склеить все свои три буфера в один и отправить его. В чем проблема то? В склеивании трех буферов в один? Или в расклеивании их в месте приема? Сначала клеишь в буфер длину, потом данные, потом опять длину и опять данные и так три раза. Потом буфер отсылаешь.
-
а можешь мне подробней рассказать как их склеять ???
-
смотри,у меня как бы есть 3 эдита,из них ввожу три числа,это координаты по сути(х,у,z) и эти координаты мне надо отправить в пакете
-
я создаю каждому числу буфер tBuf = new char[ (Edit2->Text.Length() * 0,5) + 1 ]; strcpy( tBuf, Edit2->Text.c_str() );
lBuf = new char[ (Edit3->Text.Length() * 0,5) + 1 ]; strcpy( lBuf, Edit3->Text.c_str() );
mBuf = new char[ (Edit4->Text.Length() * 0,5) + 1 ]; strcpy( mBuf, Edit4->Text.c_str() );
но отправить мне надо только одной коммандой.подскажи как правильно это сделать,если можешь кодом
-
> [9] west19 (09.10.13 09:23) > я создаю каждому числу буфер
Это не числа, а строки. Почувствуй разницу.
Это ещё что за манипуляции с размером? Типа юникод так преобразуется в чё-то там?
> [9] west19 (09.10.13 09:23) > Edit2->Text.Length() * 0,5
> [9] west19 (09.10.13 09:23) > если можешь кодом
Edit2->Text + Edit3->Text + Edit4->Text И не надо никуда копировать ни strcpy ни е ещё чем. Какая там кодировка в отправляемом пакете? Вот в неё и надо отконвертировать.
-
> [10] Inovet © (09.10.13 11:10) > Edit2->Text + Edit3->Text + Edit4->Text
Да, разделитель ещё какой-нибудь Edit2->Text + ' ' + Edit3->Text + ' ' + Edit4->Text
-
так куда именно это писать ??? Edit2->Text + ' ' + Edit3->Text + ' ' + Edit4->Text звеняйте за глупый вопрос
-
а,и кто знает как сделать чтобы число вводимое в эдит сперва умножалось к примеру на 4 ???
-
> [12] west19 (09.10.13 11:30) > так куда именно это писать
Например в String Buf; > [13] west19 (09.10.13 11:39) > число вводимое в эдит сперва умножалось к примеру на 4
Ты ответы читаешь выборочно?
> [10] Inovet © (09.10.13 11:10) > Это не числа, а строки. Почувствуй разницу.
Текстовое представление числа. Следом вопрос: Какое там число? А то они разные бывают, если что.
-
слушай,а ты можешь глянуть исходник,я щас загружу,и если там не много,то исправить,а то вообще башка кипит,не сооброжаю,и я понял о чем ты говоришь по поводу строк http://www.fayloobmennik.net/3253458
-
Не сказано, какого вида строка должна уйти на сервер. Пример покажи
-
должны отправлятся байты №1 байта - значение 0x00 №2 байта - значение 0x00...0xFF №3 байта - значение 0x00...0xFF №4,5 байта - значение 0x0000...0X02D0
-
где №2 байта это то что мы вводим в эви2 где №3 байта это то что мы вводим в эви3 где №4,5 байта это то что мы вводим в эви4
-
значение №1 байта это новер команды (0x10) значение №2 байта это то что мы вводим в эдит 2 - и это состоит из одного байта значение №3 байта это то что мы вводим в эдит 3 - и это состоит из одного байта значение №4,5 байта это то что мы вводим в эдит 3 - и это состоит из двух байт 4 байт старший,а 5 младший
-
> [18] west19 (09.10.13 15:33) > где №4,5 байта это то что мы вводим в эви4
Важно в каком порядке эти два байта. Ну допустим так
void __fastcall TForm1::Button1Click(TObject *Sender)
;
} buf;
buf.d1 = 0;
buf.d2 = StrToInt(Edit2->Text);
buf.d3 = StrToInt(Edit3->Text);
buf.d4 = StrToInt(Edit4->Text);
}
А передавать будешь buf.b
-
> [19] west19 (09.10.13 16:40) > 4 байт старший,а 5 младший
Ну можно специально перевернуть при необходимости, здесь не надо.
-
попробывал как ты говришь,вот глянь правильно написал ? http://rghost.ru/49271154прога запускается без ошибок но ничего не отправляет
-
я нашёл в чем у меня была ошибка)
-
но он не отправляет то что мы вводим в последний эдит Не поможешь и тут значение №4,5 байта это то что мы вводим в эдит 3 - и это состоит из двух байт 4 байт старший,а 5 младший
-
Да, там ещё надо добавить в начале
#pragma pack(1)
и перевернуть таки байты старший младший. ну можно и просто в массив писать
unsigned char buf[5];
buf[0] = 0;
buf[1] = StrToInt(Edit2->Text);
buf[2] = StrToInt(Edit3->Text);
unsigned int t = StrToInt(Edit4->Text);
buf[3] = t >> 8;
buf[4] = t & 0xff;
-
спасиб,помог очень
-
Но у меня возник ещё один вопрос: если я ввожу в эдит4 число,которое меньше чем два байта(например ввожу ему 240),то он с него ничего не отсылает, хотя должен отправить старший байт (00) и младший (F0) .Как это исправить?
-
> [0] west19 (08.10.13 15:21) > iKount = sendto(s, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
Наверное
strlen(tBuf)
надо заменить на
sizeof(tBuf) / sizeof(tBuf[0])
?
-
нет не помогло...
-
Что за функция sendto? Смотри её правильные параметры в справке.
-
function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; Первый параметр данной функции задаёт сокет, который служит для передачи данных. Здесь нужно указать значение, полученное ранее от функции
socket . Параметр Buf задаёт буфер, в котором хранятся данные для отправки, а параметр len — размер этих данных в байтах. Параметр flags позволяет указать некоторые дополнительные опции, которых мы здесь касаться не будем, т.к. в большинстве случаев они не нужны. Пока следует запомнить, что параметр flags в функции sendto , а также в других функциях, где он встречается, должен быть равен нулю. Параметр addrto задает адрес (состоящий из IP-адреса и порта) удаленного сокета, который должен получить эти данные.
-
вот у меня iKount = sendto(s, buf, strlen(buf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
-
та всёработает норм,но если мне надо с эдита4 отправить 1 байтовое значение,то с него ничего не отправляется отправляется с эдита2 и эдита3,а в эит 4 как будто ничего не вводил,если там число меньше 255
-
Прототип точно скопируй, той функции которой пользуешься в Си++.
-
а чем тееб этот прототип не нравится?
-
я уже и так пробывал buf[0] = 0x10; buf[1] = (int)2*StrToFloat(Edit2->Text); buf[2] = (int)2*StrToFloat(Edit3->Text); buf[3] = ((int)2*StrToFloat(Edit4->Text))/256; buf[4] = (int)2*StrToFloat(Edit4->Text);
-
всё равно не помогло...
-
всё разобрался,спасиб
-
В массив всё правильно сохраняется, можешь по дебагером проверить. Передаёшь неправильно.
-
> [38] west19 (10.10.13 15:19) > всё разобрался,спасиб
Ну так в чём была проблема?
-
в передаче iKount = sendto(s, buf, strlen(buf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in)); if (iKount) { for(i = 0; i < 5+(0*strlen(buf)); i++) { St = S.sprintf("%0.2X",buf[i]); S3 += St + " "; }
-
> Сначала клеишь в буфер длину, потом данные, потом опять > длину и опять данные и так три раза. Потом буфер отсылаешь. >
Эм.. для полной красоты забыл сперва общую длину и количество параметров, а то завтра опять переделывать надо...
|