Конференция "Сети" » КАК ПОМЕСТИТЬ З ПАРАМЕТРА В ПАКЕТ ???
 
  • 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 младший
 
Конференция "Сети" » КАК ПОМЕСТИТЬ З ПАРАМЕТРА В ПАКЕТ ???
Есть новые Нет новых   [134427   +34][b:0][p:0.001]