- 论坛徽章:
- 0
|
该函数引用于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 编辑 ] |
|