recvfrom的参数

recvfrom的参数今天遇到一个奇怪的问题。linux环境下gcc,socket中UDP的recvfrom函数原型ssize_trecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,socket_t*fromlen);网上给出的最基本的UDP—echo服务器测试基本的是可以的。…

大家好,又见面了,我是你们的朋友全栈君。

今天遇到一个奇怪的问题。

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;

不知是什么原因。

 

转载于:https://www.cnblogs.com/westfly/archive/2012/04/13/2446334.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163436.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月23日 下午5:46
下一篇 2022年7月23日 下午5:46


相关推荐

  • 172开头的IP不一定是局域网的地址

    172开头的IP不一定是局域网的地址A 类 10 0 0 0 10 255 255 255 网络数 1B 类 172 16 0 0 172 31 255 255 网络数 16C 类 192 168 0 0 192 168 255 255 网络数 255 在这三种地址中间的址是非路由的 IP 是可以用在局域网里面的 但以 172 开头的不一定是局域网的址 因为第二类不完全包括它 转自 https zhidao baidu com que

    2026年3月26日
    2
  • oracle修改用户的密码_修改linux用户密码

    oracle修改用户的密码_修改linux用户密码oracle中修改用户密码首先是win键+R输入cmd输入sqlplus/assysdba,回车,此时进入到SQL>输入alterusersystemidentifiedbysystem;这行代码的意思就是修改system用户的密码为system(注意:代码末尾要加上;分号)…

    2022年7月28日
    13
  • linux part用法,Linux下partprobe命令的使用详解

    linux part用法,Linux下partprobe命令的使用详解linux 上 在安装系统之后 可否创建分区并且在不重新启动机器的情况下系统能够识别这些分区 解决方法 你可以使用一个叫做 partprobe 的工具 它包含在 parted 的 rpm 软件包中 在 RedHatEnterp 上他的版本是 parted 1 6 partprobe 是一个可以修改 kernel 中分区表的工具 可以使 kernel 重新读取分区表 如下命令可以查看你的系统是否安

    2026年3月26日
    2
  • linux上安装Openssl步骤详解

    1,查看原有系统是否已安装Opensslopensslversion-a系统已经安装了openssl,我们先安装新的版本,然后将环境配置成最新的版本。2,从openssl官网下载最新的稳定版本,https://www.openssl.org/source/当前的稳定版是openssl-fips-2.0.16.tar.gz(联邦信息处理标准(FederalInformationProc

    2022年4月3日
    44
  • PANDAs_pandas去除缺失值

    PANDAs_pandas去除缺失值该函数主要用于滤除缺失数据。如果是Series,则返回一个仅含非空数据和索引值的Series,默认丢弃含有缺失值的行。xx.dropna()对于DataFrame:data.dropna(how=’all’)#传入这个参数后将只丢弃全为缺失值的那些行data.dropna(axis=1)#丢弃有缺失值的列(一般不会这么做,这样会删掉一个特征)data…

    2026年1月20日
    3
  • ubuntu下为lazarus添加sqlite3开发环境

    ubuntu下为lazarus添加sqlite3开发环境

    2021年8月18日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号