Socket网络编程 C/S结构如何从客户端发送一个结构体变量让服务器接收?

猴头 2010-12-10 10:19:49
大家请看我定义了一个结构体:

struct ADO_NODE
{
string TABLE_ID;
string CHANGE_TIME;
string CHANGE_TYPE;
string CHANGE_CONTENT;
ADO_NODE()
{
TABLE_ID="";
CHANGE_TIME="";
CHANGE_TYPE="";
CHANGE_CONTENT="";
}

};

想通过结构体中存储的数据从客户端发送到服务器,让服务器接收这个结构体中的数据,该如何实现呢??
socket中的send何recv函数能实现吗??
1.如果能实现,该如何实现呢?
2.如果着脸函数不能,那应该用那些函数发呢?
3.从客户端想服务器发送一个数据包,这个数据包是什么格式的啊??
求解答
...全文
744 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
猴头 2010-12-19
  • 打赏
  • 举报
回复
李刚取笑我呢
[Quote=引用 32 楼 ligang22 的回复:]
楼主真厉害。楼主的经验真让人受益匪浅,感谢楼主与大家分享这么宝贵的信息。我觉得eepeople网站上有好多适合楼主和大家的职位 ,比如资深销售工程师、高级销售经理(山西办事处)、java高级开发工程师等等,来自世界知名电子企业,有空大家可以去看看。
[/Quote]
雪狼__ 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 dongycumt 的回复:]
我示例一下:
struct TabBlock
{
x int;
y int;
z int;
}

TabBlock *p=(TabBlock*)Buf;
p->x;
p->y;
p->z;

Buf是从socket接收来的缓冲区数据。是一个完整的结构体数据。
[/Quote]

补充一下,加个帧头如:99 99 99 99 四个99,当判断是4个99时就说明接下来的数据是一个完整结构体。这样你可以不停的发数据,服务端收到后保存到数组慢慢处理。
zzw820626 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sunz619 的回复:]
需要将结构体序列化,自己定义一个序列化的协议
比如用|分割,将TABLE_ID定义为1, CHANGE_TIME定义为2等等
然后拼成一个char的串,形如"1=123|2=201012110113"这样的,然后直接将这个串send出去,服务器端recv后再根据你定义的协议格式拼回结构体

也可以使用google protocol buffer这个开源库去序列化和反序列化结构体,很方便~ ……
[/Quote]
+1
Eleven 2010-12-18
  • 打赏
  • 举报
回复
序列化一下,然后发送,对应的接收端收到以后,做相应的转换
雪狼__ 2010-12-17
  • 打赏
  • 举报
回复
我示例一下:
struct TabBlock
{
x int;
y int;
z int;
}

TabBlock *p=(TabBlock*)Buf;
p->x;
p->y;
p->z;

Buf是从socket接收来的缓冲区数据。是一个完整的结构体数据。
zdy6367 2010-12-16
  • 打赏
  • 举报
回复
只要服务端和客户端双方都约定好,很容易发送的!

send最终是要发的char*,也就是说要一个指针,你在发送的时候把ADO_NODE这个东西转成char*发就行了.

ADO_NODE st;
//添充你的结构体信息
bufflen = sizeof(ADO_NODE)
char *sendBuf=new char[bufflen];
memcpy(sendBuf,&st,bufflen);
send(s,sendBuf,bufflen,0);

客户端现在接收到了还是char*类型的,这时你再反一下,把他转成你要的格式就好了!

bufflen = sizeof(ADO_NODE)
char *recvbuff=new char[bufflen];
recv(s,recvbuff,bufflen,0);

ADO_NODE st;
memcpy(&st,recvbuff,bufflen);
这样就得到你服务端的结构体数据了.因为你的数据结构一样,怎么转换还是哪些东西,不会变
blue236146 2010-12-15
  • 打赏
  • 举报
回复
用 WSASendTo()
wilson_hz 2010-12-15
  • 打赏
  • 举报
回复
easy json可以很好的解决。用json来组包,发送的时候其实就是一个字符串发送, 接收端只要按json的格式解析就可以了。具体了解一下json
dibotiger 2010-12-14
  • 打赏
  • 举报
回复
如果你是个初学者,还是老老实实用定长的数据结构吧. 虽然可能不够智能点.

起码你自己好理解,也不会出现你这种让人更无语的问题.
羽飞 2010-12-14
  • 打赏
  • 举报
回复
结构体要是用string的话,发送的时候还是先拷到内存吧,要不然发不出去的
jackson35296 2010-12-14
  • 打赏
  • 举报
回复
不能直接发送,要做串行化处理,直接发的话,string只是一个指针而已。要写一个函数串行化结构体,再写一个函数还原结构体
dingyong2003 2010-12-14
  • 打赏
  • 举报
回复
CString序列化很慢, 不建议使用! 你应该换成TCAHR[]等!
  • 打赏
  • 举报
回复


typedef struct tag_ado
{
char TABLE_ID[ID_LEN];
char CHANGE_TIME[TIME_LEN];
char CHANGE_TYPE[TYPE_LEN];
char CHANGE_CONTENT[CONTEN_LEN];
} ADO,* LPADO;

struct ADO ado;
初始化ZeroMemery(&ado,sizeof(ado));

sprintf_s(ado.TABLE_ID,ID_LEN,"%s",table_id_or_other_u_want_transport);
.....

send(fd,XXX,xXX,, &ado,XXX);


接收端
ADO ado;
recv(XXX,XXX, &ado,XxX);

这样就行了啊。

注意宽字符,多字节编码,接收端和发送端结构体申明要一致 .

antion692980794 2010-12-11
  • 打赏
  • 举报
回复
同求~
fandouC 2010-12-11
  • 打赏
  • 举报
回复
用memcpy(),拷贝到一个char buf[]中就可以,但发送结构体要注意不同的电脑,字节大小,这些有影响的
  • 打赏
  • 举报
回复
你怎么用string。。。用char 数组代替啦。。。。。
  • 打赏
  • 举报
回复
直接发送,保持两边定义一样,成员申明的顺序移植。类型移植。就行了。注意内存对其、
向立天 2010-12-11
  • 打赏
  • 举报
回复
不能直接发送
你结构体中的sting实际上就是一个指针
没有带上数据
要么换成字符数组
要么做一个规范化的字节串
比如xml的
把你要发送的内容放到串中发过去让对方按着规则解析构造结构体
青稞 2010-12-11
  • 打赏
  • 举报
回复
你直接传string会有问题的。
协议你可以自己定的,可用TLV的形式,然后接收方就按照对应的规则来解析就行了。。
zzw820626 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mayudong1 的回复:]
引用 4 楼 yan_hyz 的回复:
可是楼上 我这样发送的时候,它提示我无法从struct类型转换为char *类型啊

引用 1 楼 yihandrensunyong 的回复:
可以实现 直接send就行 数据包的格式可以自己定 例如 包头是该数据类型 长度 什么的



那就强转一下就可以了

不过直接传string类型的东西不知道会不会有问题
[/Quote]
直接传STRING 肯定有问题的,要序列化下
加载更多回复(12)

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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