在做linux下面的网络编程时写了如下一段程序
- //(省去N行……)
- char
*source,*dest; - struct
in_addr saddr; - struct
in_addr daddr; - saddr.s_addr
= (in_addr_t)cmd.source.v_uint; //cmd.source.v_uint装载了由字符串通过inet_aton()转化成的源IP的网络字节,这里无错,不必深究:) - daddr.s_addr
= (in_addr_t)cmd.dest.v_uint; //同上 -
- source
= (char*)inet_ntoa(saddr); - dest
= (char*)inet_ntoa(daddr); -
- printf(“source[%s]
dest[%s]”,source,dest); - //(省去N行……)
执行之后打印结果总是源IP和目的IP一样,如下(程序名为pro):
#./pro -s 192.1.1.1 -d 192.2.2.2
#source[192.2.2.2] dest[192.2.2.2]
The inet_ntoa() function converts the Internet host address in, given
in network byte order, to a string in IPv4 dotted-decimal notation.
The string is returned in a statically allocated buffer, which subse-
quent calls will overwrite.
-
//(依然省去N行……) -
char source[16],dest[16]; //声明成数组,可以将内容从缓冲区里复制过来,面不是用指针指向缓冲区 - int
saddr_len,daddr_len; - struct
in_addr saddr; - struct
in_addr daddr; -
- saddr.s_addr
= (in_addr_t)cmd.source.v_uint; - daddr.s_addr
= (in_addr_t)cmd.dest.v_uint; - saddr_len
= strlen(inet_ntoa(saddr)); - daddr_len
= strlen(inet_ntoa(daddr)); -
- if(saddr_len
<=15 && daddr_len <=15) //IP址的字符串最多为15位 - {
-
memcpy(source,inet_ntoa(saddr),saddr_len); -
memcpy(dest,inet_ntoa(daddr),daddr_len); -
source[saddr_len] = '/0'; -
dest[daddr_len] = '/0'; -
- }else{
-
printf("ADDR Error/n"); -
exit(1); - }
- printf(“source[%s]
dest[%s]”,source,dest); -
- //(依然省去N行……)
习惯了用家用电器不看说明书-_-!,看来,以后在使用东西之前还是多看看说明,少走弯路