大家好,又见面了,我是你们的朋友全栈君。
今天遇到一个奇怪的问题。
linux环境下gcc,socket中UDP的recvfrom函数原型
代码语言:javascript复制ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
网上给出的最基本的UDP—echo服务器测试基本的是可以的。
关于recvfrom的代码如下
代码语言:javascript复制 char buf[BUFF_SIZE];
struct sockaddr_in their_addr;
int sin_size;
memset(buf,len,0);
retval = recvfrom(sockfd, buf, len, 0,(struct sockaddr *)&their_addr, &sin_size);
printf("%st%sn",inet_ntoa(their_addr.sin_addr),buf);
但我要定义个消息结构体msg_t,它封装了sockaddr_in和sin_size;
代码语言:javascript复制typedef struct msg_buf
{
int sockfd;
struct sockaddr_in their_addr; /* 连接对方的地址信息 */
int sin_size;
char buf[BUFF_SIZE];
size_t len;
struct msg_buf *next;
}msg_buf_t;
所以关于recvfrom的代码变成
代码语言:javascript复制 struct msg_buf *recvmsg = get_msgbuf();
size_t len = sizeof(recvmsg->buf);
char *buf = recvmsg->buf;
memset(buf,len,0);
retval = recvfrom(sockfd, buf, len, 0,(struct sockaddr *)&(recvmsg->their_addr), &(recvmsg->sin_size));
printf("%st%sn",inet_ntoa(recvmsg->their_addr.sin_addr),buf);
第一种情况,输出正确的IP地址
第二章情况,得到0.0.0.0
如果更正的话
必须是一和二的组合,代码如下
代码语言:javascript复制 struct msg_buf *recvmsg = get_msgbuf();
size_t len = sizeof(recvmsg->buf);
char *buf = recvmsg->buf;
struct sockaddr_in their_addr;
int sin_size;
retval = recvfrom(sockfd, buf, len, 0,
(struct sockaddr *)&their_addr, &sin_size);
//封装消息
recvmsg->their_addr = their_addr;
recvmsg->sin_size = sin_size;
不知是什么原因。
转载于:https://www.cnblogs.com/westfly/archive/2012/04/13/2446334.html
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163436.html原文链接:https://javaforall.cn