求助结构体SOCKET传输问题

carlolin 2009-09-01 11:10:21
struct TEST2
{
int D;
};
struct TEST1
{
int C;
TEST2 test2;
};
struct TEST
{
int A;
int B;
TEST1 test1;
};
CLINT端:
TEST test;
test.A=55;
test.B=44;
test.test1.C=20;
test.test1.test2.D=30;
char szSend[1024];
memcpy(szSend,(char*)&test,sizeof(test));
send(m_client.m_hSocket,szSend,strlen(szSend),0);
SERVER端:
TEST test;
memset(&test,0,sizeof(test));
len=recv(client,(char*)&test,sizeof(test),0);
szStr="";
CString str1;
str1.Format("%d",test.A);
szStr+=str1;
szStr+=" ";
str1.Format("%d",test.B);
szStr+=str1;
szStr+=" ";
str1.Format("%d",test.test1.C);
szStr+=str1;
szStr+=" ";
str1.Format("%d",test.test1.test2.D);
szStr+=str1;
AfxMessageBox(szStr);
结果为 55 0 0 0
...全文
118 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzy0001sl 2009-09-01
  • 打赏
  • 举报
回复
用strlen这个函数仅限于键盘输入数据的传输。你是把数据memcpy过来的,应该用sizeof才行。
carlolin 2009-09-01
  • 打赏
  • 举报
回复
我想知道为什么是那个结果 我在试试
erwin1984 2009-09-01
  • 打赏
  • 举报
回复
send(m_client.m_hSocket,szSend,strlen(szSend),0);
这里的 strlen(szSend) 应使用 sizeof(test),strlen 碰到 0 结束了,计算的长度不正确。

其实直接写成 send(m_client.m_hSocket,(const char *)&test,sizeof(test),0); 就行。
oLINo 2009-09-01
  • 打赏
  • 举报
回复
send(m_client.m_hSocket,szSend,strlen(szSend),0);
这个地方发送的长度不够,改成sizeof(test)
kakashi0309 2009-09-01
  • 打赏
  • 举报
回复
自己可以先调试下

send(m_client.m_hSocket,szSend,strlen(szSend),0); //可能是这里的strlen()长度问题
Gary@Tokyo 2009-09-01
  • 打赏
  • 举报
回复
楼主想说明什么?
hege1983 2009-09-01
  • 打赏
  • 举报
回复
1、不应该使用strlen,这个函数是用来计算C风格字符串中字符的个数,应该用sizeof求字节数

2、send、recv的使用极不正常,这两个函数都有自己的默认发送、接收缓存,应该通过循环来确保数据发送、接收完毕,而不是直接一次性地发送、接收数据 如:

假如send的默认发送缓存为512Byte,而你一次发送1024Byte,可想而知,余下的512Byte将丢失
bfzhao 2009-09-01
  • 打赏
  • 举报
回复
几点说明:
1. 使用sizeof,而不是strlen。strlen暗示它的参数是\0结束的,而你传入的是结构对象的内存布局
2. 对于这类POD数据(我称之谓raw data),使用unsigned char,这样使用strlen就会有编译器警告
3. 对于非字符型数据(任何的整数类型),使用htonX系列函数保证异构系统的兼容性

crst_zh 2009-09-01
  • 打赏
  • 举报
回复
send(m_client.m_hSocket,szSend,strlen(szSend),0); //这里错误,sizof(test),
字节数是结构体大小
你用strlen()话,要是你的字节里面有0怎么办?不是就截断了?
downmooner 2009-09-01
  • 打赏
  • 举报
回复
strlen(szSend) 参数不能用于数组类型,这样发送的应该是4个字节,和你服务器接的现象一致。
我看你有戏 2009-09-01
  • 打赏
  • 举报
回复

strlen(szSend)//因为test.A=55; 这个在内存占4个字节,55后面是0
所以strlen(szSend)= 是55的内存长度 1个字节吧



这个简介清晰
send(m_client.m_hSocket,(const char *)&test,sizeof(test),0);

oLINo 2009-09-01
  • 打赏
  • 举报
回复
可以结贴了哥们

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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