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

Socket傳送資料結構失敗?

尚未結案
裝傻
一般會員


發表:11
回覆:14
積分:5
註冊:2005-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-27 17:13:41 IP:60.248.xxx.xxx 未訂閱
各位大大你好~ 我想請問一下我的socketClint跟socketSever傳送接收的問題 我在Clinet納編寫了一各資料結構 我想要把我寫好的資料結構帶入數值 傳送至Sever端 但是它傳過去的都是"G?" 而不是我要的數值 例如: Header是我建的資料結構 我帶入它記憶體位子讓她去抓後面13個byte ClientSocket1->Socket->SendBuf(&Header,13); 可是它傳出去的數值都是"G?" 為什麼內?是我哪裡用錯了謝謝 http://myweb.hinet.net/home8/adan1234/sockettest.rar
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-28 01:10:37 IP:59.104.xxx.xxx 未訂閱
您好! 最近小弟也在寫用Socket傳送Struct! 小弟就寫一個簡單的範例給您!
  Server端
#include 
#pragma hdrstop    #include "Unit1.h"
struct Packet
{
  int iPacket_Command;          //封包命令
}SenderBuffer,ReceiveBuffer;    //傳送、接收
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  /* 接收封包(結構),將封包放到自定結構 */
  Socket->ReceiveBuf(&ReceiveBuffer,sizeof(ReceiveBuffer));
  Memo1->Lines->Add(AnsiString(ReceiveBuffer.iPacket_Command));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ServerSocket1->Port = 9999;
  ServerSocket1->Active = true;
}
//---------------------------------------------------------------------------
  Client端
#include 
#pragma hdrstop    #include "Unit1.h"
struct Packet
{
  int iPacket_Command;          //封包命令
}SenderBuffer,ReceiveBuffer;    //傳送、接收
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ClientSocket1->Address = "127.0.0.1";
  ClientSocket1->Port = 9999;
  ClientSocket1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  /* 傳送 */
  SenderBuffer.iPacket_Command = 1;
  Sleep(10);
  ClientSocket1->Socket->SendBuf(&SenderBuffer,sizeof(SenderBuffer));
  Sleep(10);
}
//---------------------------------------------------------------------------
發表人 - cashyy 於 2005/07/28 01:33:29
andychang1690
資深會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-28 01:26:19 IP:221.169.xxx.xxx 未訂閱
裝傻:直接修正你的程式,記著你傳的是struct而非字串。
test.h
struct struHeader{ //41        long            length;
    char            DeviceType[128];
    int             MachineID;
    long            MessageNU; // Nb. of Body    } Header;
Server程式
#include "..\Test.h" //記著要加入
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    Memo1->Clear();
    Socket->ReceiveBuf(&Header,Socket->ReceiveLength());
    Memo1->Lines->Add(IntToStr(Header.length));
    Memo1->Lines->Add(IntToStr(Header.MachineID));
    Memo1->Lines->Add(IntToStr(Header.MessageNU));
    Memo1->Lines->Add(AnsiString(Header.DeviceType));
    ServerSocket1->Socket->Connections[0]->SendBuf(&Header, sizeof(Header));
}
Client程式
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    //
    AnsiString s="ww";
    Header.length = 1111111;
    memcpy(Header.DeviceType,s.c_str(), s.Length());
//    Header.DeviceType = (char)"ww";
    Header.MachineID = 222222;
    Header.MessageNU = 33333333;    //    char *pSend = new char[1024];        SendStatus = WaitintResponse;
     ClientSocket1->Socket->SendBuf(&Header,sizeof(Header));    //    delete pSend;
}
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    if(SendStatus==WaitintResponse)
       {
//            char *pReceive = new char[1024];
            Socket->ReceiveBuf(&Header, Socket->ReceiveLength());
            SendStatus = GotResponse;
            ShowMessage(IntToStr(Header.MachineID)); 
//            delete pReceive;
        }
}    請參考!
Andy Chang
------
Andy Chang
裝傻
一般會員


發表:11
回覆:14
積分:5
註冊:2005-03-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-28 10:20:46 IP:60.248.xxx.xxx 未訂閱
謝謝兩位的大力幫忙 我終於知道我錯在哪了!! 真的很感謝^^
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-18 17:32:48 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-06 13:21:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!