線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1453
推到 Plurk!
推到 Facebook!

使用NMUDP:IP和Port該如何轉換呢?

答題得分者是:andychang1690
kj68215
初階會員


發表:47
回覆:91
積分:27
註冊:2003-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-14 22:43:21 IP:61.228.xxx.xxx 未訂閱
小弟用UDP做傳輸,使用了TMemoryStream送出與接收,紀錄在"Test結構"裡! Client端送出↓
struct Test
{
unsigned int ip;
unsigned short int port;
}sa;    AnsiString szIPAddr = "203.68.172.45"; //定義ip,紀錄到Test結構
int szPort=5566;                       //定義port,紀錄到Test結構
char *cp;
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      cp = szIPAddr.c_str();
      sa.ip = inet_addr(cp);
      sa.port = szPort;          NMUDP1->ReportLevel = Status_Basic;
      NMUDP1->RemoteHost = "127.0.0.1"; //本機測試(自己傳自己接)
      NMUDP1->RemotePort = 4002;        //Server端的Port          TMemoryStream* mStream = new TMemoryStream();
      mStream->Write(&sa, sizeof(sa));  //寫入mStrem,再傳送Test結構給server
      NMUDP1->SendStream(mStream);
      mStream->Free();
}
//-------------------------------------------------------------------
以上的Client端是沒問題,但是Server接收的部分在"編譯(Run)"時卻出錯(藍色code)↓
    struct Test
{
unsigned int IPAddr;
unsigned short int Port;
}sa;    struct sockaddr_in ip;
AnsiString temp;
//-------------------------------------------------------------------
void __fastcall TServer2Form::NMUDP1DataReceived(TComponent *Sender,
      int NumberBytes, AnsiString FromIP, int Port)
{
   TMemoryStream* mStream = new TMemoryStream();
   NMUDP1->ReadStream(mStream);
   mStream->Read(&sa, sizeof(sa)); //解讀出Client端傳來的Test結構       ip.sin_addr.S_un = htonl(sa.ip);
   temp = inet_ntoa(ip);
   char a = sa.port;       Edit1->Text = temp; //轉換過後的ip顯示在Edit1
   Edit2->Text = a;    //轉換過後的port顯示在Edit2
   mStream->Free();
}
//-------------------------------------------------------------------
出現錯誤訊息: [C Error] Unit1.cpp(76): E2034 Cannot convert 'unsigned long' to 'union' [C Error] Unit1.cpp(77): E2034 Cannot convert 'sockaddr_in' to 'in_addr' [C Error] Unit1.cpp(77): E2342 Type mismatch in parameter 'in' (wanted 'in_addr', got 'sockaddr_in') 小弟也不太熟悉該用什麼方法去互轉比較快速,方便... 只想到這方法!但是出了這問題,實在不知該怎麼解決... 請問各位,以上的code寫法有錯誤的地方,改怎麼修改呢? 另外,這樣的寫法,假使是多個
------
-----------------------
請多多指教啦!!^^
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-16 21:19:47 IP:219.130.xxx.xxx 未訂閱
kj68215:
先說一個觀念,我錯了話請指正,虛擬IP有可能是如我公司一樣設成
10.XXX.XXX.XXX的方式,請問轉成整數010如何顯示!何況UDP也不需要
如此處理,我改寫一下你的程式請指正並參考!
   NMUDP1->ReportLevel = Status_Basic;
   NMUDP1->RemoteHost = "127.0.0.1"; //本機測試(自己傳自己接)
   NMUDP1->RemotePort = 4002;        //Server端的Port
   AnsiString C="0 這是從 Client 端送出來的資料";
// 我比較喜歡使用
// AnsiString C;
//  C.printf("%ld %s", iTotalSendPacket, "這是從 Client 端送出來的資料");
// iTotalSendPacket是 int 從0開始可以累計計數
   int I= C.Length();
   TMemoryStream* mStream = new TMemoryStream();
   mStream->Write(&C[1], I);
   NMUDP1->SendStream(mStream);
   delete mStream;    Server接收端
void __fastcall TServer2Form::NMUDP1DataReceived(TComponent *Sender,
      int NumberBytes, AnsiString FromIP, int Port)
{
  AnsiString C;
  TMemoryStream *mStream = new TMemoryStream();
  NMUDP1->ReadStream(mStream);
  C.SetLength(NumberBytes);
  mStream->Read(&C[1], NumberBytes);
  Memo1->Clear();
  Memo1->Lines->Add(C);
  Memo1->Lines->Add("Received " IntToStr(NumberBytes) " Bytes");
  Memo1->Lines->Add("From " FromIP);
  Memo1->Lines->Add("On Port " IntToStr(Port));
  delete mStream;
請參考!對方IP及Port和資料全都有了!
Andy Chang
------
Andy Chang
kj68215
初階會員


發表:47
回覆:91
積分:27
註冊:2003-08-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-17 01:21:49 IP:61.228.xxx.xxx 未訂閱
引言: 小弟用UDP做傳輸,使用了TMemoryStream送出與接收,紀錄在"Test結構"裡! Client端送出↓
struct Test
{
unsigned int ip;
unsigned short int port;
}sa;    AnsiString szIPAddr = "203.68.172.45"; //定義ip,紀錄到Test結構
int szPort=5566;                       //定義port,紀錄到Test結構
char *cp;
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      cp = szIPAddr.c_str();
      sa.ip = inet_addr(cp);
      sa.port = szPort;          NMUDP1->ReportLevel = Status_Basic;
      NMUDP1->RemoteHost = "127.0.0.1"; //本機測試(自己傳自己接)
      NMUDP1->RemotePort = 4002;        //Server端的Port          TMemoryStream* mStream = new TMemoryStream();
      mStream->Write(&sa, sizeof(sa));  //寫入mStrem,再傳送Test結構給server
      NMUDP1->SendStream(mStream);
      mStream->Free();
}
//-------------------------------------------------------------------
Server接收的部分↓
    struct Test
{
unsigned int IPAddr;
unsigned short int Port;
}sa;    struct in_addr ip;
AnsiString temp;
//-------------------------------------------------------------------
void __fastcall TServer2Form::NMUDP1DataReceived(TComponent *Sender,
      int NumberBytes, AnsiString FromIP, int Port)
{
   TMemoryStream* mStream = new TMemoryStream();
   NMUDP1->ReadStream(mStream);
   mStream->Read(&sa, sizeof(sa)); //解讀出Client端傳來的Test結構       ip.sin_addr.S_un = htonl(sa.ip);
   temp = inet_ntoa(ip);
   char a = sa.port;       Edit1->Text = temp; //轉換過後的ip(203.68.172.45)顯示在Edit1
   Edit2->Text = a;    //轉換過後的port(5566)顯示在Edit2
   mStream->Free();
}
//-------------------------------------------------------------------
發表人 - kj68215 於 2004/08/14 23:15:43
andychang1690兄,您好! 小弟把這困擾我許久的問題,給解決了,就是以上"紅色"code的部分! 至於您提共的方法,也很好用,學到了, > 發表人 -
------
-----------------------
請多多指教啦!!^^
系統時間:2024-05-16 1:23:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!