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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 使用 data-* 属性来嵌入自定义数据:

    使用 data-* 属性来嵌入自定义数据:

    2021年10月17日
  • python保留小数位数_python小数点保留三位

    python保留小数位数_python小数点保留三位https://www.luogu.org/problemnew/show/P14221.round()内置方法a=int(input())sum=0if(a>=401):sum+=(a-400)*0.5663a=400if(a>=151):sum+=(a-150)*0.4663a=150sum+=a*0.4…

  • Ubuntu9.04上看电影加载中文字幕乱码问题

    Ubuntu9.04上看电影加载中文字幕乱码问题最近在我的Ubuntu9.04上看电影总是加载中文字幕的时候出现乱码,后来发现是字符编码的问题,今天休假在家就写了一个小的字符转码的程序,目前来说满足我自己的需求了,代码如下:importsys,ioiflen(sys.argv)!=2: print”Pleaseinputfilepath!”else: f1=io.open(sys.argv[1],”r”

  • lvm+磁盘配额

    lvm+磁盘配额

  • linux 软连接 创建/查看/删除[通俗易懂]

    linux 软连接 创建/查看/删除[通俗易懂]linux软件连接创建/查看/删除1、建立软链接具体用法是:ln-s源文件目标文件。源:实际存放文件的位置当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。-s是代号(symbolic)的意思注意:ln的链接…

  • wireshark抓包使用教程

    wireshark抓包使用教程Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。Wireshark软件安装软件下载路径:w…

发表回复

您的电子邮箱地址不会被公开。

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