免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2275 | 回复: 3
打印 上一主题 下一主题

[函数] 帮忙解释一段取ip地址和端口的函数,mynets前辈请留意 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 16:11 |只看该作者 |倒序浏览
该函数引用于mynets的帖子,一个简单的FTP服务器的源码。
/*
* Parse PORT cmd and fetch the ip and port,
* and both in network byte order.
*/
static int
cuftpd_get_port_mode_ipport(char *cmdline, unsigned int *ip, unsigned short *port)
{
        char *cp = strchr(cmdline, ' ');
        int i;
        unsigned char buf[6];

        if (!cp)
                return CUFTPD_ERR;

        for (cp++, i = 0; i < CUFTPD_ARR_LEN(buf); i++) {
                buf = atoi(cp);
                cp = strchr(cp, ',');
                if (!cp && i < CUFTPD_ARR_LEN(buf) - 1)
                        return CUFTPD_ERR;
                cp++;
        }

        if (ip)
                *ip = *(unsigned int*)&buf[0];

        if (port)
                *port = *(unsigned short*)&buf[4];

        return CUFTPD_OK;
}

函数功能我明白,整型4字节,短整型2字节我也明白。
不明白的地方是字节的顺序。
提供一个例子,明白的人帮忙解释一下。
入参:
cuftpd_do_port (ctrlfd=7, cmdline=0xbfebdc90 "PORT 192,168,187,1,11,60") at cuftpd.c:719
转换后:
ip=29075648 port=15371
格式化输出为:
CUFTPD_DEBUG("PORT cmd:%s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
(cuftpd.c:724:6304)PORT cmd:192.168.187.1:2876

为什么端口2876被存为11,60?
已逗号分隔,按顺序转换为字符,再转换为整型。这样做要遵照什么规则才能保证数值不改变?

[ 本帖最后由 xm1984 于 2009-4-27 17:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-27 17:08 |只看该作者
0x0b 0x3c可不就是2876

论坛徽章:
0
3 [报告]
发表于 2009-04-27 17:29 |只看该作者

回复 #2 雨过白鹭洲 的帖子

能不能多说几句

论坛徽章:
0
4 [报告]
发表于 2009-04-27 19:09 |只看该作者
hton和ntoh

建议查一查这两个函数的用法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP