zoukankan      html  css  js  c++  java
  • recvfrom的参数

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

    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;

    不知是什么原因。

  • 相关阅读:
    关于DOM事件操作
    js 去掉字符串前后空格
    oracle创建表索引
    导入Excel -- 套路及代码分析
    漫谈五种IO模型(主讲IO多路复用)
    Reactor模式
    jvm
    Python入门学习资料推荐
    ConcurrentHashMap & Hashtable
    分布式系统的接口幂等性设计
  • 原文地址:https://www.cnblogs.com/westfly/p/2446334.html
Copyright © 2011-2022 走看看