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
——————————————————————————
请高手帮我改正一下错误,如何才能让接收端正确接收到发送的数据谢谢 展开
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
——————————————————————————
请高手帮我改正一下错误,如何才能让接收端正确接收到发送的数据谢谢 展开
3个回答
展开全部
最主要的接收处理你没有说明是怎么做的阿?
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)) );
{
...
}
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)) );
{
...
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
结构体声明:
#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 );
#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 );
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在网络通讯过程中往往涉及一些有关联的参数传递,例如数组,结构体之类的。对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就大功告成了。
首先,我们建立一个结构体。
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相同了。具体原因其实很简单,就是因为结构体对象的内存区域连续,同时每个成员的区块大小都分配好了,当接收完自己的区块,其实自己的数据已经接收完成。
首先,我们建立一个结构体。
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相同了。具体原因其实很简单,就是因为结构体对象的内存区域连续,同时每个成员的区块大小都分配好了,当接收完自己的区块,其实自己的数据已经接收完成。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询