今天遇到一个奇怪的问题。
linux环境下gcc,socket中UDP的recvfrom函数原型
ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
网上给出的最基本的UDP—echo服务器测试基本的是可以的。
关于recvfrom的代码如下
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("%s\t%s\n",inet_ntoa(their_addr.sin_addr),buf);
但我要定义个消息结构体msg_t,它封装了sockaddr_in和sin_size;
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的代码变成
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("%s\t%s\n",inet_ntoa(recvmsg->their_addr.sin_addr),buf);
第一种情况,输出正确的IP地址
第二章情况,得到0.0.0.0
如果更正的话
必须是一和二的组合,代码如下
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;
不知是什么原因。