使用NMUDP:IP和Port該如何轉換呢? |
答題得分者是:andychang1690
|
kj68215
初階會員 發表:47 回覆:91 積分:27 註冊:2003-08-09 發送簡訊給我 |
小弟用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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 小弟用UDP做傳輸,使用了TMemoryStream送出與接收,紀錄在"Test結構"裡! Client端送出↓andychang1690兄,您好! 小弟把這困擾我許久的問題,給解決了,就是以上"紅色"code的部分! 至於您提共的方法,也很好用,學到了, > 發表人 -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
------
----------------------- 請多多指教啦!!^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |