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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一、基础部分-1.进制转换

    一、基础部分-1.进制转换

    2022年3月13日
    41
  • Mariadb源代码编译过程

    Mariadb源代码编译过程

    2022年3月6日
    38
  • Cefsharp_ceph nfs

    Cefsharp_ceph nfs文章目录0.简介1.安装2.H.264支持3.加载本地HTML文件4.多个窗口显示浏览器0.简介CefSharp,简单来说就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件。它支持HTML5。CefSharp的功能比较复杂,以下只介绍一些我觉得比较重要的并且目前经常用的功能,此“挑食”之意也。1.安装CefSharp的安装过程如下:打开VisualStduio,新建一个Windows窗体应用(.NETFramework);在“工具”

    2022年9月19日
    0
  • 【系统架构设计师】第一章:操作系统(1.1.1—1.1.2)操作系统的分类和结构

    【系统架构设计师】第一章:操作系统(1.1.1—1.1.2)操作系统的分类和结构好久不见了。最近由于忙着期末考试,所以一直没更新帖子,最近考完了,我又回来了。很久不动笔了,突然很手痒,但是又一直在纠结写什么。原计划要写kali的从零开始的教程,不过仔细想想其实那个并没有系统架构师的专注力大,因为这个是我的一个目前的目标。你们知道的,我今年大二,下个学期会特别忙,有七八场ctf和awd,线上线下的都有,这就意味着我基本整个学期的一半都要在外地跑。更别说还有实习,招警考试…想想就头疼。不过好在我学计算机还是比较有天赋的,所以专业课反而是最轻松的一个。但是,我的想法不仅仅只是课程.

    2022年6月28日
    26
  • Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」

    Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」总览WindowsNT工具包(WindowsNTResourceKit)提供了两个小工具,可以让我们创建自定义服务(适合于NT应用和一些16进制应用,批处理除外)。两个工具包的下载地址:CSDN下载Instrsrv.exe:从系统安装和移除服务Srvany.exe:主要作用是将任何应用程序处理成为一个可以作运行的服务明细步骤按照以下步骤操作,来创建用户自定义服务:(为…

    2022年6月1日
    36
  • 全网最全python爬虫精进

    全网最全python爬虫精进4.25(第一天)**第0关认识爬虫**1、初始爬虫爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。2、明晰路径2-1、浏览器工作原理(1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;(2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;(3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。2-2、爬虫工作原理(1)获取数据:爬虫程序会根据

    2022年5月27日
    34

发表回复

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

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