Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 进一步检查C头文件_C++_C_Visual Studio 2013_Header Files_Msdn - Fatal编程技术网

C++ 进一步检查C头文件

C++ 进一步检查C头文件,c++,c,visual-studio-2013,header-files,msdn,C++,C,Visual Studio 2013,Header Files,Msdn,通过查看Microsoft Visual Basic 2013中的工作包嗅探器的代码,我正在学习c语言中的网络 下面的代码创建指向hostent结构的指针,获取localhost主机名,并将其加载到名为local的hostent结构中 下一部分使地址能够以点十进制表示法打印 for (i = 0; local->h_addr_list[i] != 0; ++i) { memcpy(&addr, local->h_addr_list[i], sizeof(struct

通过查看Microsoft Visual Basic 2013中的工作包嗅探器的代码,我正在学习c语言中的网络

下面的代码创建指向hostent结构的指针,获取localhost主机名,并将其加载到名为local的hostent结构中

下一部分使地址能够以点十进制表示法打印

for (i = 0; local->h_addr_list[i] != 0; ++i)
{
    memcpy(&addr, local->h_addr_list[i], sizeof(struct in_addr));
    printf("  Interface Number : %d Address : %s\n",i,inet_ntoa(addr));
}
现在,我想了解这一切是如何运作的,还有更多

假设我想了解inet_ntoa(),我右键单击并选择转到定义转到声明,它会将我发送到WinSock2.h,显示:

inet_ntoa(
    __in struct in_addr in
);
这似乎是向我显示参数,但不是函数的工作方式或返回值。这意味着我必须参考MSDN来了解每次发生的事情

我的问题是:读取正在发生的事情的代码在哪里,这样我就不必使用文档了

例如,
inet\u ntoa
功能内容在哪里?

这里是:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

/* The interface of this function is completely stupid, it requires a
   static buffer.  We relax this a bit in that we allow one buffer for
   each thread.  */

static __thread char buffer[18];

char *inet_ntoa (struct in_addr in)
{
   unsigned char *bytes = (unsigned char *) &in;
   __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
               bytes[0], bytes[1], bytes[2], bytes[3]);

  return buffer;
}
#包括
#包括
#包括
/*这个函数的接口非常愚蠢,它需要一个
静态缓冲区。我们稍微放松一下,因为我们允许一个缓冲区
每根线*/
静态线程字符缓冲区[18];
char*inet\u ntoa(地址中的结构)
{
无符号字符*字节=(无符号字符*)&in;
__snprintf(缓冲区,sizeof(缓冲区),%d.%d.%d”,
字节[0]、字节[1]、字节[2]、字节[3]);
返回缓冲区;
}
摘自inet_ntoa.c,glibc 2.23

请记住,glibc是开源的,因此如果您想探索一下并了解幕后的情况,请不要犹豫并下载它

问候

给您:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

/* The interface of this function is completely stupid, it requires a
   static buffer.  We relax this a bit in that we allow one buffer for
   each thread.  */

static __thread char buffer[18];

char *inet_ntoa (struct in_addr in)
{
   unsigned char *bytes = (unsigned char *) &in;
   __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
               bytes[0], bytes[1], bytes[2], bytes[3]);

  return buffer;
}
#包括
#包括
#包括
/*这个函数的接口非常愚蠢,它需要一个
静态缓冲区。我们稍微放松一下,因为我们允许一个缓冲区
每根线*/
静态线程字符缓冲区[18];
char*inet\u ntoa(地址中的结构)
{
无符号字符*字节=(无符号字符*)&in;
__snprintf(缓冲区,sizeof(缓冲区),%d.%d.%d”,
字节[0]、字节[1]、字节[2]、字节[3]);
返回缓冲区;
}
摘自inet_ntoa.c,glibc 2.23

请记住,glibc是开源的,因此如果您想探索一下并了解幕后的情况,请不要犹豫并下载它


关于

inet\u ntoa
是在系统DLL中实现的,特别是
Ws2\u 32.DLL
。没有可用的Microsoft源。您将能够找到可用于其他平台的开源实现。Linux文档在这里,这在许多库中实现,例如glibc实现了它,您可以阅读它的代码,因为您可以下载整个glibc。它通常不在头文件中实现。这是WinSock2.h的完整引用吗?因为函数声明似乎缺少一个返回类型,它根本不应该工作。
inet\u ntoa
是在系统DLL中实现的,特别是
Ws2\u 32.DLL
。没有可用的Microsoft源。您将能够找到可用于其他平台的开源实现。Linux文档在这里,这在许多库中实现,例如glibc实现了它,您可以阅读它的代码,因为您可以下载整个glibc。它通常不在头文件中实现。这是WinSock2.h的完整引用吗?因为函数声明似乎缺少一个返回类型,它根本不应该工作。@Phoenix您可以下载glibc代码,然后执行类似于
find的操作-类型f-名称'*.c'-exec grep-nH--color“inet_ntoa”{}\从代码的根目录。然后你可以找到它的实现位置。最好提供一个到源代码的实时链接:(我并不认为这个链接会有太大的变化:P…还有,有趣的评论)切题:这里有一个线程讨论这个函数有问题的接口和
inet\u ntop()的可用性,它使用了我们很多人一直期望的那种界面:我想已经足够好了,但是OP要求微软的代码,这是另外一回事。@SvenNilsson说得不错。我想这取决于OP是否只想知道函数必须做什么,而不是它具体如何做。但是,撇开API文档不谈,函数签名通常会使前者相当清晰。我不明白为什么OP的报价中似乎缺少返回类型。@Phoenix您可以下载glibc代码,然后执行类似于
find的操作-类型f-名称'*.c'-exec grep-nH--color“inet_ntoa”{}\从代码的根目录。然后你可以找到它的实现位置。最好提供一个到源代码的实时链接:(我并不认为这个链接会有太大的变化:P…还有,有趣的评论)切题:这里有一个线程讨论这个函数有问题的接口和
inet\u ntop()的可用性,它使用了我们很多人一直期望的那种界面:我想已经足够好了,但是OP要求微软的代码,这是另外一回事。@SvenNilsson说得不错。我想这取决于OP是否只想知道函数必须做什么,而不是它具体如何做。但是,撇开API文档不谈,函数签名通常会使前者相当清晰。我对为什么OP的报价中似乎缺少返回类型感到困惑。