socket发送接收结构体

1.在服务端和发送端都定义了相同的结构体structstrData{intiNum;charcName[20];unsignedintuChinese;unsignedi... 1.在服务端和发送端都定义了相同的结构体
struct strData
{
int iNum;
char cName[20];
unsigned int uChinese;
unsigned int uMath;
unsigned int uEnglish;
};
2.在发送端写好了函数SendData(CString sSend),在接收端写好了函数RecvData(CString& sRecv)
3.在发送端写入:
strData s;
s.iNum = 144;
sprintf(s.cName,"卡卡西");
s.uChinese = 80;
s.uMath = 89;
s.uEnglish = 70;
CString sSend;
sSend.Format("%s",(char*)&s);
if(!SendData(sSend))
MessageBox("发送失败");
else
MessageBox("发送成功");
在接收端写入:
char cRecv[MAXSIZE];
memset(cRecv,0,MAXSIZE);
sprintf(cRecv,"%s",sRecv);
str = *(struct strData*)cRecv;
printf("%d\n%s\n%d\n%d\n%d\n",
str.iNum,str.cName,str.uChinese,
str.uMath,str.uEnglish);
结果:接收到的数据是:
144

0
0
0
——————————————————————————
请高手帮我改正一下错误,如何才能让接收端正确接收到发送的数据谢谢
展开
 我来答
厉经浩星27
推荐于2017-11-26 · TA获得超过439个赞
知道小有建树答主
回答量:451
采纳率:0%
帮助的人:414万
展开全部
最主要的接收处理你没有说明是怎么做的阿?

sRecv 是怎么接收的?
真的接收成功了吗?

/////////////////////////////////
主要问题是你的Client 发送问题。
结构没有发送出去。

strData s;
s.iNum = 144;
sprintf(s.cName,"卡卡西");
s.uChinese = 80;
s.uMath = 89;
s.uEnglish = 70;
CString sSend;
sSend.Format("%s",(char*)&s);

这里s结构在内存中是
0x90 0x00 0x00 0x00 0x50 ....

你的sSend通过Format是得不到你想要的数据。
CString 的Format 时遇到'\0'会截断。所以实际中sSend中只有一个 0x90字符。

修改SendData函数
BOOL CClientDlg::SendData(char* sSend,int iSendLen,const unsigned int uPort )

然后调用时
if(!SendData( (char*)&s,sizeof(strData)) );
{
...
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
missing442
2008-11-24 · TA获得超过446个赞
知道小有建树答主
回答量:453
采纳率:0%
帮助的人:372万
展开全部
结构体声明:
#pragma pack(push)
#pragma pack(1)
struct _CTBOX_COMMAND_STRUCT
{
unsigned char BtnName;
unsigned char BtnAction;
unsigned char AccelarateSpeed;
};
#pragma pack(pop)
发送:
_CTBOX_COMMAND_STRUCT CmdAction;
send(s_socket,(char*)&CmdAction,sizeof(_CTBOX_COMMAND_STRUCT),0);
接收:
_CTBOX_COMMAND_STRUCT * recvbuf = new _CTBOX_COMMAND_STRUCT();
RecvBytes = recv( p_Socket, (char*)recvbuf, RecvLength, 0 );
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暖萱紫菱
推荐于2018-05-15 · TA获得超过1.6万个赞
知道小有建树答主
回答量:2129
采纳率:93%
帮助的人:162万
展开全部
在网络通讯过程中往往涉及一些有关联的参数传递,例如数组,结构体之类的。对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就大功告成了。
  首先,我们建立一个结构体。
  struct UsrData{
  char usr_id[16];
  char usr_pwd[16];
  char usr_nickname[16];
  };
  当然,这个结构体在发送方与接收方都必须声明。
  接下来创建对象并初始化,然后发送。
  UsrData sendUser;
  memcpy( sendUser.usr_id, “100001”, sizeof(“100001”) );
  memcpy( sendUser.usr_pwd, “123456”, sizeof(“123456”) );
  memcpy( sendUser.usr_nickname, “Rock”, sizeof(“Rock”) );
  send( m_socket, (char *)&sendUser, sizeof(UsrData), 0 );
  这样发送方就已经将这个mUser对象以字符串的形式发送出去了。
  最后在接收方做接收。
  char buffer[1024];
  UsrData recvUser;
  recv( m_socket, buffer, sizeof(buffer), 0 );
  memcpy( &recvUser, buffer, sizeof(buffer) );
  这样得到的recvUser对象里的数据与sendUser相同了。具体原因其实很简单,就是因为结构体对象的内存区域连续,同时每个成员的区块大小都分配好了,当接收完自己的区块,其实自己的数据已经接收完成。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式