socket发送和接受TList类型数据

晴天v1 2008-08-21 12:15:58
大家好,我的问题是这样的:在客户端用TList对象保存一些结构体,然后把TList对象发送到服务器端,客户端的发送源码如下:

void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{

int buf_len = 0 ;

buf_len =tlist->Count*sizeof(Infor);

ShowMessage(buf_len);

ClientSocket1->Socket->SendBuf(tlist,buf_len);//

}

Infor的定义
struct Infor{

char name[40];
char version[10];
char publish[10];

};

tlist是客户端的一TList类型的全局变量,里面有一些Infor对象。

服务器端的接收:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{

int rec_size = Socket->ReceiveLength(); //

ShowMessage(rec_size);

char *buf ; //定义接收的缓存,不知可不可以这样定义 ,如果 用 TList * buf ; int temp = Socket->ReceiveBuf(buf,rec_size); 就会报错

buf = new char[rec_size];

int temp = Socket->ReceiveBuf(buf,rec_size); //

ShowMessage(temp); //接收到的数据长度


memcpy(tlist,buf,rec_size); // 这样拷贝 不知可不可以?

Infor *temp_infor =NULL ;

for(int i=0;i<tlist->Count;i++){//取得 tlist中的每一个Infor 对象


temp_infor = (Infor*)tlist->Items[0]; // 这里出问题 ???
ShowMessage(temp_infor->name) ;

}
}

tlist也为一TList 对象,服务器端运行接收数据的时候,这行 “ temp_infor = (Infor*)tlist->Items[0]; ”总报错,说读内存错误,应该是没有把TList类型读出来,传过来的数据长度都是正确的。

希望高手指点,谢谢。
...全文
118 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
晴天v1 2008-08-25
  • 打赏
  • 举报
回复
谢谢 楼上,是按“飘逸的安吉儿”的办法做的,传之前先把TList中的每个结构体copy到char * buf[] 里面,server接的时候也是存到char *buf[]里面,用循环每次读buf里面一个结构体长度,copy到一个结构体里面,在把结构体add到TList里面。

谢谢 各位。衷心的谢谢。
nuptwzp 2008-08-25
  • 打赏
  • 举报
回复
你TList里面的内容你确定都存放进去了吗?
在发送前你可以先把TList的内容放到一个Buffer里面打印出来看看
还有要注意的就是如飘逸的安吉儿说的,最好自己对socket包进行一次封装,因为socket本身并不知道你一条完整的记录有多长
晴天v1 2008-08-21
  • 打赏
  • 举报
回复
分不多,再进来几个就结帐了。
晴天v1 2008-08-21
  • 打赏
  • 举报
回复
谢谢楼上的建议,确实是个好方法,开始我是用 Infor的数组发和接收的,那样子可以做到,但问题就是我的Infor数目是动态的,而数组又不支持动态声明,才想到用TList ,开始也用过vector 把Infor存起来再发,那样子也不行。
楼上的方法肯定可以的,再次谢谢。
constantine 2008-08-21
  • 打赏
  • 举报
回复
不能这样发送,需要自己把数据整理出来,比如个数+内容。
用for吧List中的数据copy到一个临时的buf,然后发送。
接收时先读前面的个数,然后在读 个数*sizeof(Infor)这么长的数据的buf,然后回头自己分解
晴天v1 2008-08-21
  • 打赏
  • 举报
回复
谢谢 jxw1987628 。

如果接收也为 TList 对象,即TList ×plist = new TList();

接收的时候编译可以通过,运行时会出错, rec_buf_len = Socket->ReceiveLength();可以得到发送端发送的实际长度。

问题未解,请高手继续进来解惑。
jxw1987628 2008-08-21
  • 打赏
  • 举报
回复

我觉得接收应该也是TList对象

TList *pList=new TList();

而且接收的长度应该根据你发送的长度来设置
比如你发送的长度为

 const int send_buf_len =tlist->Count*sizeof(Infor); 
const int recv_buf_len=send_buf_len;//(好像有个实际的发送长度,具体你看下)


int temp = Socket->ReceiveBuf(pList,recv_buf_len); 


这里得到了pList ,然后解析出来。。。





1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧