Конференция "Сети" » Передача файла с помощью сокетов (UDP)
 
  • west19 (14.10.13 11:56) [0]
    Суть вопроса,что у меня не так??? рассказываю что есть,в общем прога отправляет данные,эт норм,но мне надо чтобы когда я подключаюсь(нажимаю на сonnect) она мне выводила данные которые уже присланы  в буфер с другого устройства.
    походу по напутал с адресами.у меня адрес 192.168.100.10 порт 5824
    присылают мне с 192.168.100.1 порт 5826
    вот код программы
    //---------------------------------------------------------------
    #include <vcl.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <registry.hpp>
    #pragma hdrstop
    #include "main.h"
    //---------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    #define PORT 5826
    #define SERVERADDR "192.168.100.1"
    #define CLIENT_FILE "example.txt"
    #define Line "File is recivied"
    #define Nsize 1024
    #include <stdio.h>
    #include <string.h>

    TForm1 *Form1;

    SOCKET s;
    WSADATA WsaData;
    bool first;
    int SuccCount, FalseCount;
    char* cp;
    //---------------------------------------------------------------
    void LoadParams(void)
     TRegistry* R = new TRegistry(KEY_READ | KEY_WRITE);
     R->OpenKey("Software\\Rif\\Udp",true);
     TRegistry* L = new TRegistry(KEY_READ | KEY_WRITE);
     L->OpenKey("Software\\Rif\\Udp",true);
     TRegistry* M = new TRegistry(KEY_READ | KEY_WRITE);
     M->OpenKey("Software\\Rif\\Udp",true);
     try {
       Form1->Edit1->Text=R->ReadString("IP");
       Form1->Edit2->Text=R->ReadString("Tx");
       Form1->Edit3->Text=L->ReadString("Ty");
       Form1->Edit4->Text=M->ReadString("Tz");
       Form1->Edit5->Text=M->ReadString("Tq");
       Form1->Edit6->Text=M->ReadString("Tw");
       Form1->Edit7->Text=M->ReadString("Te");
     }
     catch (...) {
       ;
     }
     R->CloseKey();
     delete R;
       M->CloseKey();
     delete M;
       L->CloseKey();
     delete L;
    }
    //---------------------------------------------------------------
    void SaveParams(void)
    {
     TRegistry* R=new TRegistry;
     R->OpenKey("Software\\Rif\\Udp",true);
     TRegistry* L=new TRegistry;
     L->OpenKey("Software\\Rif\\Udp",true);
     TRegistry* M=new TRegistry;
     M->OpenKey("Software\\Rif\\Udp",true);
     try {
       R->WriteString("IP",Form1->Edit1->Text);
       R->WriteString("Tx",Form1->Edit2->Text);
       L->WriteString("Ty",Form1->Edit3->Text);
       M->WriteString("Tz",Form1->Edit4->Text);
     }
       catch (...) {
       ;
     }
     R->CloseKey();
     delete R;
         M->CloseKey();
     delete M;
       L->CloseKey();
     delete L;
    }
    //---------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
     LoadParams();
     Memo1 -> Clear();
     Memo2 -> Clear();
     Memo1->Font -> Color = clWindowText;
    }
    //---------------------------------------------------------------
    void __fastcall TForm1::ConectClick(TObject *Sender)
    {
     Memo1->Font -> Color = clWindowText;
     cp = new char[ Edit1->Text.Length() + 1 ];
     strcpy( cp, Edit1->Text.c_str() );
     int err = WSAStartup (0x0101, &WsaData);
     if (err == SOCKET_ERROR)
     {
      Memo1->Lines->Add("WSAStartup() failed: " + IntToStr(GetLastError()));
      return ;
     }
     s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
     if (s == SOCKET_ERROR)
     {
      Memo1->Lines->Add("Ñîêåò íå ñîçäàí! " + IntToStr(GetLastError()));
      return ;
     }
     else
     {
      Memo1->Lines->Add("Ñîêåò ñîçäàí!");
     }
     Form1->Conect->Enabled=false;
     Form1->Disconnect->Enabled=true;
     Form1->Button1->Enabled=true;
     Form1->Edit1->Enabled=false;
     //-------------------
     char buff[Nsize];
     int i;
       sockaddr_in anAddr;
     anAddr.sin_family = AF_INET;
    anAddr.sin_port = htons(5824);
    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(5826);
     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;
       }
       while(1)
       {
         char tBuf[53];
         sockaddr_in dest_addr;
         memset(&dest_addr, 0, sizeof(sockaddr_in));
         int dest_addr_size = sizeof(sockaddr_in);
         int bsize=recvfrom(s, tBuf, Nsize * sizeof(char), 0, (sockaddr *) &dest_addr, &dest_addr_size);
         if (bsize==SOCKET_ERROR)
         {
               printf("recvfrom() error: %d\n", WSAGetLastError());
               break;
         }
         buff[bsize-3]=0;
         printf("Client=>Server:%s\n",buff);
      }
     }
  • west19 (14.10.13 11:56) [1]
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     char Buffer[255];
     char * pBuf;
     char Answer[255];
     int iKount, i, ClearCount, err;
     AnsiString S, St, Se, S2, S3, str, Estr;
     ClearCount = 0;
     unsigned char buf[5];
    buf[0]=0;
    buf[1]=0;
    buf[2]=0;
    buf[3]=0;
    buf[0] = 0x10;
    buf[1] = (StrToFloat(Edit2->Text)*2);
    buf[2] = (StrToFloat(Edit3->Text)*2);
    unsigned int t = (StrToFloat(Edit4->Text)*2);
     buf[3] = t >> 8;
     buf[4] = t & 0x00ff;
     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);
     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, 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 + " ";
       }
       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);
     sockaddr_in server_addr;
     int server_addr_size=sizeof(server_addr);
     if (!first)
     {
       DWORD time_out = 1000;
       setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&time_out, sizeof (DWORD));
       err = recvfrom(s,&Answer[0],Nsize + 1,0,(sockaddr *) &server_addr, &server_addr_size);
       if (err < 0)
       {
         Memo1->Lines->Add("Ïðèåì íå óñïåøåí! " + IntToStr(GetLastError()));
         FalseCount++;
       }
       else
       {
         SuccCount++;
         ClearCount=0;
         str="";
         while (err)
         {
           str += Answer[ClearCount];
           err--;
           ClearCount++;
         }
         pBuf = new char[str.Length() + 1 ];
         strcpy( pBuf, str.c_str() );
         for(i = 0; i < strlen(pBuf); i++)
        {
           St = S.sprintf("%0.2X",pBuf[i]);
           S2 += St + " ";
         }
     //-------------------------------------------
          Edit5->Text = IntToStr(pBuf[1]);
          Edit6->Text = IntToStr(pBuf[2]);
          Edit7->Text = IntToStr(pBuf[3]);
          Edit7->Text = IntToStr(pBuf[4]);
     //--------------------------------------------
         Memo1->Font -> Color = clGreen;
         Memo1->Lines->Add("");
         Memo1->Lines->Add("Ïðèíÿòî áàéò: " + IntToStr(ClearCount));
    //      Memo1->Lines->Add(atoi(str));
         Memo1->Lines->Add(str);
         Memo1->Lines->Add(S2);
       }
     }
     }

     StatusBar1->SimpleText="Óñïåøíûõ/íåóñïåøíûõ îáìåíîâ: "+ IntToStr(SuccCount) +
                               "/"+ IntToStr(FalseCount)+".";
    }
    //---------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
     SaveParams();
    }
  • west19 (14.10.13 12:03) [2]
    вот ссылка на скач исходника http://www.fayloobmennik.net/3263958
  • brother © (14.10.13 14:16) [3]
    почему не tcp?
  • west19 (14.10.13 14:29) [4]
    задали использовать UDP
  • DVM © (14.10.13 16:53) [5]

    > задали использовать UDP

    Чтобы по UDP в реальных условиях отличных от тепличных условий локальной сети передать файл, надо городить поверх UDP свой протокол по аналогии с TCP, с разбиением на фрагменты, сборкой, проверкой этих фрагментов и повторной передачей при утере фрагмента, в противном случае ничего толкового не выйдет.
  • west19 (14.10.13 16:59) [6]
    подскажи как это всё в моём случме реализовать,выше есть ссылка на мои исходники
  • west19 (14.10.13 17:00) [7]
    Если конечно тебе не сложно
  • brother © (14.10.13 17:17) [8]
    1. ты понимаешь разницу между udp и tcp?
    2. что это за ТЗ такое, кто его придумал?
    3. твои исходники - мусор, и начинать надо с правильной озвучки ТЗ, если это не курсач нонечно...
  • brother © (14.10.13 17:19) [9]
    > когда я подключаюсь(нажимаю на сonnect) она мне выводила
    > данные которые уже присланы  в буфер с другого устройства.

    кто кому отсылает данные?
  • DVM © (14.10.13 22:48) [10]

    > west19

    кстати, а причем тут файлы, что-то я тут не вижу файлов.

    Ты бы толком описал, что ты хочешь сделать, а то из описания выше ничего не понятно.
  • Inovet © (15.10.13 00:27) [11]
    > [10] DVM ©   (14.10.13 22:48)
    > что ты хочешь сделать

    Предполагаю, что из едитов получилось одну порцию отправлять после подсказок в прошлой ветке, которые трасформировались в в этой ветке каких-то уродцев. Теперь надо из файла последовательность этих комманд отправить.
  • west19 (15.10.13 08:48) [12]
    1.пакет который формируется в программе,он отправляется,и его получают на том конце.
    2.но ответ не приходит!
    3.на мой айпи постоянно шлются данные с другого прибора,даже когда прога не подключена.так вот,мне надо чтобы при конекте выводились в моё окно те данные которые уже шлются. и сделать чтобы пункт 2 тоже работал(когда я отправил,то и ответ выводился,а на данный момент отправка гуд,а прием не успешен) вот и всё
  • west19 (15.10.13 08:49) [13]
    вот ссылка на полный искодник http://www.fayloobmennik.net/3263958
    кто чем может помогите
  • brother © (15.10.13 10:36) [14]
    > кто чем может помогите

    18см, помог?
  • west19 (15.10.13 10:45) [15]
    ???
  • west19 (15.10.13 10:47) [16]
    знаешь,хочешь по умничать то тебе место на других сайтах,тут бля тупо спросили,поможете или нет,и всё.я уже 3й день мучаюсь с этой фигнёй,отправлять отправляет,а принемать не принемает,кучу похожих примеров нашёл,но не где нет того что мне надо.
  • brother © (15.10.13 11:26) [17]
    а кому это нужно? еще и НЕ на делфи???
  • brother © (15.10.13 11:26) [18]
    и я не вижу ответа на [8]
  • west19 (15.10.13 12:11) [19]
    Вот тебе ответ
    1.Разницу знаю.Уже писал на tcp.
    2 а ТЗ таково
    1)нужно написать приложение с которого будут отправлятся координаты которые мы вводим в эдит(x,y,z) .отправляется это всё байтами.1 байт это команда,второй байт это угол (x) его значения могут быть от 0x00 до 0xFF,третий байт это угол (y) его значения могут быть от 0x00 до 0xFF , четвертый и пятый байт это угол (z)  его значения могут быть от 0x0000 до 0x02D0 .
    2)адреса:
    у меня адрес 192.168.100.10 порт 5824
    присылают мне с 192.168.100.1 порт 5826
    3)мне постоянно шлют данные,даже когда программа не включена у меня,и когда я включю её,при коннекте должны вывестись данные которые поступаею мне с другого компа.

    То преложение что я сделал(вверху есть ссылка на скачку) работает,отсылает данные,их понимают,но ответ не присылает.Вот в чем нужна помощь,в выводе данных,мне их шлют,но они ко мне в прогу не поступают
 
Конференция "Сети" » Передача файла с помощью сокетов (UDP)
Есть новые Нет новых   [118427   +6][b:0][p:0.001]