socket如何发送结构体?
我在客户端上把USERINFO结构体变量强制转换为char指针,再发送到服务端,然后服务端用memcpy方法把接收到的数据再复制到一个USERINFO类型的的结构体变量中,但却是空的。求正确的办法,谢谢了
[解决办法]
一般来说,先要将结构体转换成字符串流再传输
到了服务端后再将字符流转成结构体
=============
你这样做也是可以的
但要注意
1 服务端和客户端结构体定义要严格一致(包括使用的对齐值等)
2 不能有指针
3 传输时注意启始和结束
[解决办法]
将结构体转换成char*然后再发送。注意服务端的结构体和客户端结构体要严格一致。
定长的简单,直接转成char*搞定。
如果结构体是变长的,要用到一些trick。
最简单的就是零长度的数组。
struct test
{
int aint;
char buff[0];
}
分配内存的时候 test pTest = new(sizeof(test) + n);
然后发送的长度就是 sizeof(test) + n
然后转换成char *发送过去就是了。
[解决办法]
struct test
{
int aint;
char buff[10];
}
test buf;//定义结构体变量
int len=sizeof(test);
send(s,(char*)&buf,len,0)//这样就OK了,
不管你要发送什么都东西,只是是连续内存区域,都可以强制转换成char*发送出去
[解决办法]
给出USERINFO的结构具体内容.
该结构中是否包含指针.
转换为char*后,其内容是什么长度有多大.
接收方接收到的char*内容是什么,有多大.和发送时的内容是否一致.
接收后,强制转换为USERINFO时.是否与预期一致
USERINFO若包含指针.则指针自身的值是否与预期一致(指针所指的位置肯定不是原来的位置).
如果都一致的话,则说明没有问题.但有可能与你预期的效果不一致(指针自身值是一致,但指向的内容肯定不能是同一个地方).
[解决办法]
关键问题:
1) 你的代码没有逻辑错误
2) 你的结构体里用的是不是只有C++内置类型,而没有自定义类型,如:string,string里面是指针,数据在堆上,这类需要自己序列化,然后再传输,收到后反序列化
3) 如果用的都是内置类型,要注意服务器和客户端的CPU类型,字节顺序是否一样,如果一个是大端模式,一个是小端模式,收到的数据肯定还是不对