tcp的socket编程多线程([转载]c/c++通过socket发送结构体_林少油_新浪博客)
c/c++通过socket发送结构可以直接先将结构转化到内存中 ,再通过send直接发送 。
在网络通讯过程中往往涉及一些有关联的参数传递 ,例如数组 ,结构体之类的 。对于结构体其实方法挺简单 ,由于结构体对象在内存中分配的空间都是连续的 ,所以可以将整个结构体直接转化成字符串发送 ,到了接收方再将这个字符串还原成结构体就大功告成了 。
首先 ,我们建立一个结构体 。
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相同了 。具体原因其实很简单 ,就是因为结构体对象的内存区域连续 ,同时每个成员的区块大小都分配好了 ,当接收完自己的区块,其实自己的数据已经接收完成 。挺简单的 ,但还是挺有用的 。
也可以直接将内存写到文件中:
int cfg_fd = -1;
cfg_fd = open(HD4100_CONFIG_FILE,
O_RDWR|O_CREAT|O_TRUNC);if (cfg_fd <
0){
printf("open
config file failed/n");return -1;
}
write(cfg_fd, para,
sizeof(hd4100_rec_t));
//hd4100_rec_t是自定义的结构close(cfg_fd);
printf("the para which is written to the config
file:/n");read(cfg_fd, &hd4100_config,
sizeof(hd4100_rec_t));//从文件读内容到内存中close(cfg_fd);
包含引用类型或值类型的结构或对象无法通过以上方法直接发送 ,而必须通过序列化的方式转化为二进制流发送和接收 。如c#
Socket传送序列化Struct示例:传数据,下面给一个传送struct的例子.
首先:把struct写到一个单独的类中.编译成dll
using System;
[Serializable]
public struct USER_INF
{
public long id;
public string nickname;
public string sex;
public int age;
public string address;
public string password;
}
然后在你的服务器端和客户端都添加这个dll.
下面是服务器端发送这个序列化的struct
while(true)
{
Socket s=tcpl.AcceptSocket();
BinaryFormatter bf;
bf = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
USER_INF user;
user.id=0;
user.nickname="Pony";
user.sex="?";
user.age=20;
user.address="192.168.7.91";
user.password="123456";
bf.Serialize(stream,user);
byte[] buff = stream.ToArray();
s.Send(buff,buff.Length,0);
s.Close();
Console.WriteLine("?????!");
}
一下是client端接收到数据后反序列化
BinaryFormatter bf;
bf = new BinaryFormatter();
USER_INF user=(USER_INF)bf.Deserialize(s);
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 );char buffer[1024];
UsrData recvUser;
recv( m_socket, buffer, sizeof(buffer), 0 );
memcpy( &recvUser, buffer, sizeof(buffer)
);创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!