Конференция "Сети" » КАК ПОМЕСТИТЬ З ПАРАМЕТРА В ПАКЕТ ???
 
  • west19 (08.10.13 15:21) [0]
    у  меня была прога в которой одно значение вводимое с едита формировалось в пакет и передовалось по 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);
  • DVM © (08.10.13 16:03) [1]

    > у  меня была прога в которой одно значение вводимое с едита
    > формировалось в пакет и передовалось по UDP протоколу,а
    > теперь надо чтобы передовалось три значения

    Три раза передать по одному?
  • west19 (08.10.13 16:52) [2]
    нет,одновременно ,в одном пакете
  • west19 (08.10.13 16:53) [3]
    по отдельности я уже передовал,а мне надо один заходом
  • west19 (08.10.13 16:55) [4]
    У меня Эдит1,Эдит2,Эдит3 ,я ввожу туда данные(слова,цифры) отправить надо в одном покете,не по отдельности,а одновременно.Звеняйте за тавтологию
  • west19 (08.10.13 17:02) [5]
    Этом коде передается в пакете только с первого Эдита  
    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 параметра отправились не знаю.
  • DVM © (08.10.13 17:46) [6]

    > west19   (08.10.13 16:52) [2]
    > нет,одновременно ,в одном пакете

    Ну в одном пакете или не одном решать не тебе, а операционной системе, но в принципе можешь склеить все свои три буфера в один и отправить его. В чем проблема то? В склеивании трех буферов в один? Или в расклеивании их в месте приема? Сначала клеишь в буфер длину, потом данные, потом опять длину и опять данные и так три раза. Потом буфер отсылаешь.
  • west19 (09.10.13 08:47) [7]
    а можешь мне подробней рассказать как их склеять ???
  • west19 (09.10.13 09:20) [8]
    смотри,у меня как бы есть 3 эдита,из них ввожу три числа,это координаты по сути(х,у,z) и эти координаты мне надо отправить в пакете
  • west19 (09.10.13 09:23) [9]
    я создаю каждому числу буфер
    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() );

    но отправить мне надо только одной коммандой.подскажи как правильно это сделать,если можешь кодом
  • Inovet © (09.10.13 11:10) [10]
    > [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 ни е ещё чем. Какая там кодировка в отправляемом пакете? Вот в неё и надо отконвертировать.
  • Inovet © (09.10.13 11:17) [11]
    > [10] Inovet ©   (09.10.13 11:10)
    > Edit2->Text + Edit3->Text + Edit4->Text

    Да, разделитель ещё какой-нибудь
    Edit2->Text + ' ' + Edit3->Text + ' ' + Edit4->Text
  • west19 (09.10.13 11:30) [12]
    так куда именно это писать ??? Edit2->Text + ' ' + Edit3->Text + ' ' + Edit4->Text
    звеняйте за глупый вопрос
  • west19 (09.10.13 11:39) [13]
    а,и кто знает как сделать чтобы число вводимое в эдит сперва умножалось к примеру на 4 ???
  • Inovet © (09.10.13 12:00) [14]
    > [12] west19   (09.10.13 11:30)
    > так куда именно это писать

    Например в
    String Buf;
    > [13] west19   (09.10.13 11:39)
    > число вводимое в эдит сперва умножалось к примеру на 4

    Ты ответы читаешь выборочно?

    > [10] Inovet ©   (09.10.13 11:10)
    > Это не числа, а строки. Почувствуй разницу.

    Текстовое представление числа. Следом вопрос: Какое там число? А то они разные бывают, если что.
  • west19 (09.10.13 14:45) [15]
    слушай,а ты можешь глянуть исходник,я щас загружу,и если там не много,то исправить,а то вообще башка кипит,не сооброжаю,и я понял о чем ты говоришь по поводу строк
    http://www.fayloobmennik.net/3253458
  • Inovet © (09.10.13 15:23) [16]
    Не сказано, какого вида строка должна уйти на сервер. Пример покажи
  • west19 (09.10.13 15:32) [17]
    должны отправлятся байты
    №1 байта - значение 0x00
    №2 байта - значение 0x00...0xFF
    №3 байта - значение 0x00...0xFF
    №4,5 байта - значение 0x0000...0X02D0
  • west19 (09.10.13 15:33) [18]
    где №2 байта это то что мы вводим в эви2
    где №3 байта это то что мы вводим в эви3
    где №4,5 байта это то что мы вводим в эви4
  • west19 (09.10.13 16:40) [19]
    значение №1 байта это новер команды (0x10)
    значение №2 байта это то что мы вводим в эдит 2 - и это состоит из одного байта
    значение №3 байта это то что мы вводим в эдит 3 - и это состоит из одного байта
    значение №4,5 байта это то что мы вводим в эдит 3 - и это состоит из двух  байт
    4 байт старший,а 5 младший
  • Inovet © (09.10.13 16:46) [20]
    > [18] west19   (09.10.13 15:33)
    > где №4,5 байта это то что мы вводим в эви4

    Важно в каком порядке эти два байта. Ну допустим так


    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //...
     union TBuf
     {
       unsigned char b[5];
       struct
       {
         unsigned char d1;
         unsigned char d2;
         unsigned char d3;
         unsigned short d4;
       }
    ;
     } buf;

     buf.d1 = 0;
     buf.d2 = StrToInt(Edit2->Text);
     buf.d3 = StrToInt(Edit3->Text);
     buf.d4 = StrToInt(Edit4->Text);
    //...
    }


    А передавать будешь
    buf.b
  • Inovet © (09.10.13 16:50) [21]
    > [19] west19   (09.10.13 16:40)
    > 4 байт старший,а 5 младший

    Ну можно специально перевернуть при необходимости, здесь не надо.
  • west19 (09.10.13 17:13) [22]
    попробывал как ты говришь,вот глянь правильно написал ?
    http://rghost.ru/49271154
    прога запускается без ошибок но ничего не отправляет
  • west19 (09.10.13 17:24) [23]
    я нашёл в чем у меня была ошибка)
  • west19 (09.10.13 17:28) [24]
    но он не отправляет то что мы вводим в последний эдит
    Не поможешь и тут
    значение №4,5 байта это то что мы вводим в эдит 3 - и это состоит из двух  байт
    4 байт старший,а 5 младший
  • Inovet © (09.10.13 17:33) [25]
    Да, там ещё надо добавить в начале

    #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;

  • west19 (10.10.13 10:52) [26]
    спасиб,помог очень
  • west19 (10.10.13 10:56) [27]
    Но у меня возник ещё один вопрос: если я ввожу в эдит4 число,которое меньше чем два байта(например ввожу ему 240),то он с него ничего не отсылает, хотя должен отправить старший байт (00) и младший (F0) .Как это исправить?
  • Inovet © (10.10.13 11:39) [28]
    > [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])


    ?
  • west19 (10.10.13 13:02) [29]
    нет  не помогло...
  • Inovet © (10.10.13 13:37) [30]
    Что за функция sendto? Смотри её правильные параметры в справке.
  • west19 (10.10.13 13:39) [31]
    function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer;
    Первый параметр данной функции задаёт сокет, который служит для передачи данных. Здесь нужно указать значение, полученное ранее от функции

    socket
    . Параметр
    Buf
    задаёт буфер, в котором хранятся данные для отправки, а параметр
    len
    — размер этих данных в байтах. Параметр
    flags
    позволяет указать некоторые дополнительные опции, которых мы здесь касаться не будем, т.к. в большинстве случаев они не нужны. Пока следует запомнить, что параметр
    flags
    в функции
    sendto
    , а также в других функциях, где он встречается, должен быть равен нулю. Параметр
    addrto
    задает адрес (состоящий из IP-адреса и порта) удаленного сокета, который должен получить эти данные.
  • west19 (10.10.13 13:41) [32]
    вот у меня
    iKount = sendto(s, buf, strlen(buf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));
  • west19 (10.10.13 13:43) [33]
    та всёработает норм,но если мне надо с эдита4 отправить 1 байтовое значение,то с него ничего не отправляется отправляется с эдита2 и эдита3,а в эит 4 как будто ничего не вводил,если там число меньше 255
  • Inovet © (10.10.13 14:02) [34]
    Прототип точно скопируй, той функции которой пользуешься в Си++.
  • west19 (10.10.13 14:23) [35]
    а чем тееб этот прототип не нравится?
  • west19 (10.10.13 14:29) [36]
    я уже и так пробывал
    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);
  • west19 (10.10.13 14:29) [37]
    всё равно не помогло...
  • west19 (10.10.13 15:19) [38]
    всё разобрался,спасиб
  • Inovet © (10.10.13 15:23) [39]
    В массив всё правильно сохраняется, можешь по дебагером проверить. Передаёшь неправильно.
  • Inovet © (10.10.13 15:24) [40]
    > [38] west19   (10.10.13 15:19)
    > всё разобрался,спасиб

    Ну так в чём была проблема?
  • west19 (10.10.13 16:52) [41]
    в передаче
    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 + " ";
       }
  • Dennis I. Komarov © (22.10.13 23:35) [42]

    > Сначала клеишь в буфер длину, потом данные, потом опять
    > длину и опять данные и так три раза. Потом буфер отсылаешь.
    >

    Эм.. для полной красоты забыл сперва общую длину и количество параметров, а то завтра опять переделывать надо...
 
Конференция "Сети" » КАК ПОМЕСТИТЬ З ПАРАМЕТРА В ПАКЕТ ???
Есть новые Нет новых   [134427   +34][b:0][p:0.002]