首先庆祝下Rock博客(ray77.com)的Google PR今天荣升到2了,对于Google的工程师们PR似乎只是个小游戏,但还是挺值得高兴的。以后Rock只发布原创的东西了,即使要转载也只转载一些相当有意义的文章,充数的杂闻就可以PASS了 :wink: 。In my opinion , It is simply a weblog , a personal blog …

  再唠叨下工作的事情。摩力游(moliyo)的人力资源部与程序部的高管似乎比较认可我的资质与技术水平,但学校还有些麻烦的事情需要请假处理这让他们比较难接受,不管怎么样,Rock一直在尽量协商,但愿不会影响到复试。对摩力游的中级客户端工程师还是相当憧憬的。 :neutral:

  嗯,接下来进入主题了,谈下C++中如何利用socket发送结构体,此教程只供网络编程菜鸟参考,高手可以绕路了。 :!:


   在网络通讯过程中往往涉及一些有关联的参数传递,例如数组,结构体之类的。对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就大功告成了。

  首先,我们建立一个结构体。

  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相同了。具体原因其实很简单,就是因为结构体对象的内存区域连续,同时每个成员的区块大小都分配好了,当接收完自己的区块,其实自己的数据已经接收完成。挺简单的,但还是挺有用的。 :smile: