browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

对 inet_ntoa 的看法

Posted by on 2004 年 09 月 07 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

C++代码
  1. char FAR * inet_ntoa (   
  2.   struct in_addr in     
  3. );  

这个函数可以把 IPv4 地址数据转换为字符串的形式。
看着这个函数总觉得有些别扭,心想对于一般的 Win32 API 而言,返回字符串的形式应该是类似这个样子:

C++代码
  1. returntype SomeFunction(LPTSTR lpBuffer);  

为了搞清楚它里面的秘密,我写了如下的代码进行测试:

C++代码
  1. struct in_addr ip;   
  2. ip.S_un.S_addr = 0x12345678;   
  3. char * str = inet_ntoa(ip);   
  4. MessageBox(NULL, str, "IP", 0);   
  5. ip.S_un.S_addr = 0x87654321;   
  6. inet_ntoa(ip);   
  7. MessageBox(NULL, str, "IP", 0);  

执行的结果是 str 所指向的内存空间的内容改变了。如此看来,这个函数的实现应该是这个样子:

C++代码
  1. char FAR * inet_ntoa (struct in_addr in)   
  2. {   
  3.   static char strRet[16];   
  4.   // …   
  5.   return strRet;   
  6. }  

老实说,我觉得这样的代码不够科学,对外部代码的耦合性不是很好,而且浪费内存。

订阅本站

没有评论

(Required)
(Required, will not be published)