socket发送接收结构体

来源:百度知道 编辑:UC知道 时间:2024/05/15 06:05:58
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 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相同了。具体原因其实很简单,就是因为结构体对象的内存区域连续,同时每个成员的区块大小都分配好了,当接收完自己的区块,其实自己的数据已经接收完成。

最主要的接收处理你没有说明是怎么做的阿?

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

/////////////