c++中socket编程,c++实现socket通信
[转载]c/c通过socket发送结构_林绍友_新浪博客
转载]c/c通过socket发送结构
原文地址:c/c通过socket发送结构作者:少在冰天雪地里旅行
C/c通过socket发送结构可以直接先把结构转换成内存,然后通过send直接发送。
在网络通信过程中,经常会涉及到一些相关的参数,如数组、结构等。事实上,构造的方法很简单。因为结构对象在内存中分配的空间是连续的,所以整个结构可以直接转换成一个字符串发送。当接收者将这个字符串返回给结构时,它就完成了。
首先,我们建立一个结构。
结构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缓冲区[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(打开
配置文件失败/n’);
return-1;
}
write(cfg_fd,第,
sizeof(HD 4100 _ rec _ t));
//hd4100_rec_t是自定义结构。
close(CFG _ FD);
printf(写入配置文件的段落
file:/n );
读取(cfg_fd,hd4100_config,
sizeof(HD 4100 _ rec _ t));//将文件内容读入内存
close(CFG _ FD);
包含引用类型或值类型的结构或对象不能通过上述方法直接发送,而必须通过序列化转换为二进制流才能发送和接收。比如c#
套接字传输序列化结构的示例:
为了传输数据,这里有一个传输struct的例子。
第一:把struct写成一个单独的类,编译成dll。
使用系统;
[可序列化]
公共结构USER_INF
{
公共长id;
公共字符串昵称;
公开串性;
公共int age
公共字符串地址;
公共字符串密码;
}
然后在服务器和客户机上添加这个dll。
下面是服务器发送此序列化的结构
while(真)
{
套接字s=tcpl。accept socket();
BinaryFormatter bf
BF=new binary formatter();
memory stream stream=new memory stream();
USER_INF用户;
user . id=0;
user.nickname= Pony
user.sex=?;
user.age=20
user . address= 192 . 168 . 7 . 91 ;
user.password= 123456
bf。序列化(流,用户);
byte[] buff=stream。to array();
南发送(buff,buff。长度,0);
南close();
控制台。WriteLine(?);
}
首先,客户端接收数据并将其反序列化。
BinaryFormatter bf
BF=new binary formatter();
USER_INF user=(USER_INF)bf反序列化;
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。