网络编程基础,需要帮助理解 addrinfo / sockaddr_in 结构体的使用等

Posted

技术标签:

【中文标题】网络编程基础,需要帮助理解 addrinfo / sockaddr_in 结构体的使用等【英文标题】:network programming basics, need help to understand addrinfo / sockaddr_in structs usage etc 【发布时间】:2013-08-11 16:44:27 【问题描述】:

我开始学习 C/C++ 网络编程,但我一开始就卡住了。我在编程方面有点菜鸟,但我了解 C 库、指针、结构等基本知识。我找不到关于 addrinfo / sockaddr_in 结构相关的一些详细信息的很好解释的信息。类似结构的数量很烦人,在线教程也很混乱。作为附加信息,我可以说我正在使用 Visual c++ 2010 express 在 Windows 上编程。我不知道我已经知道的信息是否正确。我认为它是这样工作的:

    sockaddr_in 不再需要在任何地方手动创建和填充,因为函数“getaddrinfo”为我完成了这项工作,使用我在 addrinfo 中手动定义的信息,所以 addrinfo 是替换所有 sockaddr_in 的东西。 似乎 HOSTENT 结构没用,因为它在“gethostbyname”函数中使用,并且由于“getaddrinfo”而被弃用

现在有几个问题:

“addrinfo”的引入如何改变常用函数的使用 - 现在是否有任何函数采用其他参数,例如 addrinfo 而不是 sockaddr_in 作为它们的一部分?

似乎没有 addrinfo 的老式编程对初学者更友好,我想我现在只想使用 sockaddr_in 因为我只学习并想做简单的东西,这是个好主意吗?

如果我的理解正确,请告诉我,如果可能的话,回答我的问题,欢迎cmets或解释。

编辑 由于我没有得到直接的答案来解释我不明白的事情,所以我一直试图弄清楚它是如何工作的,我可能对这些事情了解得更多。

我现在最想知道的是,在“gethostbyname”被弃用之后,HOSTENT 结构的角色,因为“getaddrinfo”功能使其无用。我想知道细节,因为我想知道我在代码的每个部分都在做什么。

【问题讨论】:

如果您想了解这个级别的详细信息,您可能需要Stevens。 在我看来,这并不是很详细,我认为从事 C++ 网络编程的人知道这些结构的用法。我也在寻找我收集的信息是否正确的确认。使用 getaddrinfo 的人会知道答案。 【参考方案1】:

很遗憾,我不会回答您的问题,但是,我完全建议您阅读 Beej 指南,这是一个很好的入门参考:http://beej.us/guide/bgnet/

【讨论】:

我确实已经读过,Beej 的指南很旧(它鼓励使用 winsock.h 现在什么是古老的库)并且没有很好地描述这些结构。我找不到详细信息,而且标题使用更改如此混乱,很难取得进展。【参考方案2】:

Berkeley Socket API 已有 30 年历史(出生于 1983 年)。所以它充满了很多杂物。 Windows Socket API 是一个多迭代的“bsd-ish”。或者,换一种说法,你是从一个你可能不需要的兔子洞开始的。

如果您真的想了解 API 的演变,实际上您将不得不阅读书籍——很可能是 Steven 的“Unix 网络编程”,然后阅读有关 WinSock 移植的材料。但是没有一个确定的来源,因为 Windows 的开发不是透明的,而且在过去 10 年左右的时间里,微软在让他们的开发人员充分了解情况方面一直是不完整的(这就是一个很好的例子)。

但是,如果您真正想做的是了解在网络中移动数据包的实用性,而不是了解所涉及结构的细节,您可能希望从查看稍微更高级别的 API 开始,例如“ libevent”(不幸的是,非常喜欢 C)或“ZeroMQ”或“AMQP”(rabbitmq 或 Apache qpid)。

【讨论】:

我不是在寻找 API 的演变,但是我很难理解这些基础知识,因为这很复杂,而且很难理解,因为它使用过时的结构和源代码来改变东西和新结构看起来不太合乎逻辑(更像是一团糟,而不是展示它是如何工作的),所以我无法自己回答,我什至不知道如何开始自己编写代码来测试它。此外,我更愿意从 winsock 开始,而不是从替代品开始。【参考方案3】:

好的,我不确定您在寻找什么答案。因此,我将尝试采取一般建议路线。去年我完成了一个项目,我走上了 winsock 路线,虽然我确信有很多新方法我发现我喜欢 winsock / sockaddr_in 的东西(尽管我绝不是任何方面的编程大师)。我基本上是从一个简单的服务器/客户端对开始的,它允许两个人通过 ad-hoc 网络聊天。而且我发现 sockaddr_in 结构足够直观,可以使用。如果您想以较小的规模开始,您可以通过将客户端端口设置为环回 IP 并让您的客户端连接到此套接字(通过线程从同一应用程序中或具有单独的适用于您的客户端和服务器的应用程序)。只需让您的服务器侦听连接并发送简单的“成功”字符串或其他内容。我从 youtube 上找到的一个人那里得到了大部分这些想法(我知道,这很令人震惊!)这是一个 link。希望这可以帮助。快乐编码!

【讨论】:

谢谢,你给了我很好的例子,从详细的描述开始。我正在寻找的答案是有关由替换“sockaddr_in”的真正令人困惑的结构“addrinfo”引起的更改的详细信息。 Beej 的指南是唯一提到这些结构的共同点的指南,很难找到详细信息来理解它们的区别。 我只用了 sockaddr_in 所以拿这个帖子加点盐!!乍一看,似乎 addrinfo 结构由比 sockaddr_in 结构更多的数据成员组成(包括 sockaddr 本身的一个实例..还描述了更多关于它与之关联的套接字,例如 TCP 或 UDP 或 RAW 等)。也许如果您浏览一些 MSDN 文档或某处埋藏的论坛,您会发现有人为这两个提供最佳用例分析。在我看来,我将从 sockaddr_in 方法开始并学习基础知识。希望这会有所帮助!

以上是关于网络编程基础,需要帮助理解 addrinfo / sockaddr_in 结构体的使用等的主要内容,如果未能解决你的问题,请参考以下文章

winsock编译错误,找不到addrinfo结构和一些相关函数

帮助理解D3的SVG基础知识

addrinfo结构体原型-(转自 cxz2009)

需要帮助理解主干中嵌套视图的基础知识

struct addrinfo 和 struct sockaddr 有啥区别

计算机网络入门概念理解