recvfrom()中如何接收结构体
来源:互联网 发布:linux文件颜色 编辑:程序博客网 时间:2024/05/19 16:33
UDP编程时经常需要使用sendto()和recvfrom()两个函数,其中recvfrom()的函数原型是:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
一般来说第二个变量buf和第三个变量len是难点。buf是指针就可以了,并不一定是char*类型,但是如果你想直接发送和接收结构体类型的指针,往往会出错(比如Bad Address或者Segmentation fault之类的)。事实证明,还是得使用char*作为buffer来接收数据。
例子:
我有一个结构体:
struct dv_element{
char dest;
int dist;
};
struct distance_vector{
char sender;
int num_of_dests;
dv_element dve[6];
};
在发送和接收的代码前,我定义了
#define ECHOMAX sizeof(struct distance_vector) //maximum incoming data length
distance_vector rcdv; //store the incoming distance vector
distance_vector dv; //store the outgoing distance vector
int dvLen = sizeof (dv); //length of outgoing data
想要发送的时候,使用
sendto(sock, (char*) &dv, dvLen, 0, (struct sockaddr *)
&echoServAddr, sizeof (echoServAddr));
想要接收的时候,使用
recvfrom(sock, (char*) &rcdv, ECHOMAX, 0,
(struct sockaddr *) &fromAddr, &fromSize))
这两个函数都把想要发送(接收)的结构体的地址强制转换成了char*型,所幸没有出错,数据都很完整。若是不完整,那你可以考虑下在发送之前自己写一段代码把要发送的结构体里的内容存入char*型里,然后发送这个char*型变量,接收时,写一段代码把这个char*型变量读到结构体里(以上只是我的想法,并没有用实验证明可行与否)。
当然,接收数据之前要把创建好的socket bind到自己localhost的端口上。具体怎么创建socket,怎么bind请google别的帖子学习吧,这里就不说了。
- recvfrom()中如何接收结构体
- 接收数据recvfrom
- 关于recvfrom接收超时
- 关于recvfrom接收超时
- Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
- Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
- Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
- recvfrom接收udp包代码,注释中写明了几点注意事项
- DBus如何传送和接收数据,包括结构体
- recv, recvfrom, recvmsg用于接收数据
- recvfrom()
- recvfrom
- recvfrom
- recvfrom() 中from参数解释
- tcp recv 和 udp recvfrom 接收的包个数
- 多进程udp接收recvfrom返回-1原因分析
- unicode字符集下recvfrom接收char数组数据
- 如何设置socket的connect() recvfrom() 超时
- 基于OpenVPN建立SSL VPN网络(连接异地局域网+远程单点接入)
- VC++获取文件修改时间
- SSL VPN隧道建立过程
- 生活规划
- wxWidgets下wxTextCtrl风格
- recvfrom()中如何接收结构体
- POJ 3041 Asteroids 【匈牙利算法最小点覆盖】
- POJ 3083 Children of the Candy Corn
- 逆波兰表达式
- HTML5在线摄像头应用
- Android(4)——Google Map、GPS、传感器使用
- 逆波兰表达式
- android权限大全
- 10189 - Minesweeper