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


相关推荐

  • Zabbix监控memcache示例

    Zabbix监控memcache示例

    2021年9月4日
    72
  • Android 用ListView实现排序「建议收藏」

    Android 用ListView实现排序「建议收藏」点击“单价”按钮或“数量信息”按钮,可按据升序或降序进行排序。布局没什么好说的在这里插入代码片<LinearLayoutxmlns:android=”http://schemas.android.com/apk/res/android”xmlns:app=”http://schemas.android.com/apk/res-auto”xmlns:tools=”http://schemas.android.com/tools”android:layout_widt

    2025年11月10日
    7
  • python读取txt中的一列称为_python读取txt文件并取其某一列数据的示例

    python读取txt中的一列称为_python读取txt文件并取其某一列数据的示例python读取txt文件并取其某一列数据的示例菜鸟笔记首先读取的txt文件如下:AAAAF1100003E8180003E1FC0003E7700003FFFC90AAAAF1100003E8240003E2080003E76C0003FFFCA5AAAAF1100003E8140003E2040003E7600003FFFC85AAAAF1100003E7F0…

    2022年5月27日
    49
  • 工程师必备APP抓包技能

    工程师必备APP抓包技能奇技·指南一台上网电脑就能完成APP抓包分析一条龙服务。这是一篇APP抓包分析总结性文章,采用APP模拟器与Web调试代理工具组合玩法。从此APP抓包分析能力变得…

    2022年5月30日
    28
  • torch.meshgrid()函数解析

    torch.meshgrid()函数解析torch.meshgrid()函数解析torch.meshgrid()的功能是生成网格,可以用于生成坐标。函数输入两个数据类型相同的一维张量,两个输出张量的行数为第一个输入张量的元素个数,列数为第二个输入张量的元素个数,当两个输入张量数据类型不同或维度不是一维时会报错。其中第一个输出张量填充第一个输入张量中的元素,各行元素相同;第二个输出张量填充第二个输入张量中的元素各列元素相同。#【1】importtorcha=torch.tensor([1,…

    2022年6月5日
    135
  • mysql修改表名

    mysql修改表名ALTER TABLE table_nameRENAMETOnew_table_name

    2022年6月1日
    29

发表回复

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

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