如何用ServerSocket和ClientSocket发送结构(struct)类型数据? (100分)

  • 主题发起人 主题发起人 wxf_wxf
  • 开始时间 开始时间
W

wxf_wxf

Unregistered / Unconfirmed
GUEST, unregistred user!
在客户端用:
Socket->SendBuf(user,100);其中user为一结构指针变量,好像是发送出去了?但在服
务器端用:
Socket->ReceiveBuf(buf,100),buf与客户端的user结构一样?但是接收的数据为空?
这是什么原因呢?
 
user需要分配内存先。
typedef struct __TestStr
{
AnsiString UserCode;
long UserId;
}TestStr,*PTestStr;
PTestStr aa;
aa = new TestStr();
aa->UserCode = "123";
这样就不会出错了。否则你就不要定义指针类型,如:
TestStr aa;
aa.UserCode = "123";
 
呵呵,楼主怎么把原来的问题改成这个了,[8D]
首先,需要判断发送是否成功,最好用if (Socket->SendBuf(user,sizeof(TestStr)) == sizeof(TestStr)){}
接收时同样这样子判断。如果是接收成功,那么应该对应字段里有对应的内容的了。
 
同意chenxz,
重要的是看看是否接收成功了,然后就是应该用sizeof()取结构大小。
 
也就是说是能够发送结构性的数据呢?
 
我快要崩溃了,今天怎了一天都整不出来!
 
我觉得在发送时因将其转换为数据流!然后在接收时在作相应的处理?
 
为了不给自己找麻烦,所发送的结构应该是定长的。根据我们与其它厂商进行系统接口的经验,如果不是非常特殊的需求,一般都是发送定长的结构的。
定长的结构不定包括指针类型的成员,比如:
typedef struct _MyStruct1{ //此结构是定长的,发送时只需要用sizeof()获取长度即可
int a;
char b[20];
}MyStruct1;
struct MyStruct2{ //此结构是不定长的,就必须转换成流的方式进行发送
AnsiString A;
float *b;
};
发送不定长的数据相当麻烦,必须在每次收发数据之前都要收发一个控制包,发端在控制包中先声明接下来的数据有多长,收端才可以根据此信息分配接收缓冲区的大小并接收数据。
如果发送定长的结构,没有必要使用指针类型(为分配和释放内存多写两行代码,实在没有必要)只需要在参数中传递结构的地址即可。
例:
MyStruct1 st1;
st1.a = 123;
strcpy(st1.b, "Information");
Socket->SendBuf(&st1, sizeof(st1));
 
贴个例子给你好了;
typedef struct MyStruct
{
long lVal;
char Str[20];
}MYSTRUCT;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MYSTRUCT MyStruct;
MyStruct.lVal = 123456;
strcpy(MyStruct.Str,"this a test");
ClientSocket1->Socket->SendBuf(&MyStruct,sizeof(MYSTRUCT));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
MYSTRUCT MyStruct;
Socket->ReceiveBuf(&MyStruct,sizeof(MYSTRUCT));
ShowMessage("long value = " + (AnsiString)MyStruct.lVal + ",string value = " + (AnsiString)MyStruct.Str);
}
 
用流,这类的东西我以前做过 (好象是这样好就没有用了接不太清了,程序结构没有做)
TMemoryStream *tms=new TMemoryStream();
tms->write(结构提指针,sizeof(结构体));
然后用socket把这个流发出去
接受的时候用
TMemoryStream *tms=new TMemoryStream();
tms->read(结构提指针,受到的字节数);读到结构提里
 
多人接受答案了。
 
后退
顶部