结构体发送接收问题

HELLO_wallace 2008-05-04 03:58:53
问题1:
客户端和服务器端都定义了如下结构体
typedef struct REGISTER_INFO
{
char name[20];
char age[10];
char introduce[100];
char job[20];
char pw[20];
char sex[10];
char city[10];
}*register_info;
在客户端发送的时候:send(sockClient,(char*)info,sizeof(info)+1,0);
服务器端接受时候:register_info info;
info = (register_info)buffer;
然后测试:str3 = info->pw;
MessageBox(str3);
发现显示一堆乱码!这是为什么呢?结构体里面的pw字段怎么样才能准确呢?
问题2:
服务器端在结构消息时,怎么样区别是这个结构体发送过来的消息还是其他消息呢?
case FD_READ:
的时候能结构到很多消息怎么样区分结构体和其他消息?
...全文
195 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2008-05-05
  • 打赏
  • 举报
回复
指针!指针!

在客户端发送的时候:
REGISTER_INFO info;
send(sockClient, (char*)&info, sizeof(REGISTER_INFO), 0);

recv的部分代码:
char buffer[500];
int nRet = recv(sock, buffer, 500, 0);
if (nRet == sizeof(REGISTER_INFO))
{
REGISTER_INFO* pInfo = (REGISTER_INFO*)buffer;
CString str3(info->pw);
MessageBox(str3);
}
僵哥 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 HELLO_wallace 的回复:]
我在send 前检查了(char*)info
输出后只有info->name,也就是说只有第一字段,这是为什么?
[/Quote]
你用什么办法检查?你用MessageBox,取的是一个字符串,字符串即以'\0'结束的一个连续的字符组合,name就是一个完整的串,碰到'\0'的时候,就认为你的字符串已经结束,你怎么可能还看得到后面的内容?
lwykj 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 scq2099yt 的回复:]
自己定义通信协议,然后做好封包解包
[/Quote]
scq2099yt 2008-05-05
  • 打赏
  • 举报
回复
自己定义通信协议,然后做好封包解包
caitian6 2008-05-05
  • 打赏
  • 举报
回复
mark
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
你的send函数改成下面这样了吗?
send(sockClient,(char*)info,sizeof(REGISTER_INFO),0);
aj3423 2008-05-04
  • 打赏
  • 举报
回复
sizeof(info)+1 为什么要加1,只发结构体的话sizeof(info)就可以了
aj3423 2008-05-04
  • 打赏
  • 举报
回复
send(sockClient,(char*)info,sizeof(info)+1,0);
改成
send(sockClient,(char*)&info,sizeof(info)+1,0);
HELLO_wallace 2008-05-04
  • 打赏
  • 举报
回复
9楼说的情况没解决啊!顶
downmooner 2008-05-04
  • 打赏
  • 举报
回复
send(sockClient,(char*)info,sizeof(info)+1,0);

你这有错吧

如果你的info是个指针 那么就真的只发了5个字节了~~~~
HELLO_wallace 2008-05-04
  • 打赏
  • 举报
回复
我在send 前检查了(char*)info
输出后只有info->name,也就是说只有第一字段,这是为什么?
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
同上,sizeof(指针变量)是指针变量的长度,32位程序是4。
僵哥 2008-05-04
  • 打赏
  • 举报
回复
info是一个指针吧?
register_info info;

是这样子定义的不?

send(sockClient,(char*)info,sizeof(struct REGISTER_INFO)/*+1 ,不需要加一*/,0); 
HELLO_wallace 2008-05-04
  • 打赏
  • 举报
回复
recv的返回值是5,为什么只接受了5个字节?发送端发送了5个?
HELLO_wallace 2008-05-04
  • 打赏
  • 举报
回复
我发现在send的时候,输出时,只有第一个被显示其他的都没
register_info info = new REGISTER_INFO;
strcpy(info->name,name);
strcpy(info->job,job);
strcpy(info->age,age);
strcpy(info->introduce,introduce);
strcpy(info->sex,sex);
strcpy(info->city,city);
if(pw.Compare(pw2) == 0)
strcpy(info->pw,pw);
else
{
MessageBox("对不起,您的两次输入密码不一致,请重新填写");
return;
}


MessageBox((char*)info);
输出时只有name,为什么呢?
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
看看recv的返回值是不是小于sizeof(info),另外,在send的时候确认一下结构中的数据是不是乱码。
HELLO_wallace 2008-05-04
  • 打赏
  • 举报
回复
recv的部分代码:
char buffer[500];
CString str1,str2,str3;
recv(sock,buffer,200,0);
register_info info;
info = (register_info)buffer;
str3 = info->pw;
MessageBox(str3);
晨星 2008-05-04
  • 打赏
  • 举报
回复
流式套接字不是面向消息的,是面向字节的,理论上无法直接区分消息头和消息尾。
所以最好自行定义明确的应用层协议。
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
1、看一下你recv的代码,注意recv的返回值。
2、需要自定义协议,通常做法是加个包头,包头中注明数据类型、长度等。

18,356

社区成员

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

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