C 和 C++ 中的套接字解​​释

Posted

技术标签:

【中文标题】C 和 C++ 中的套接字解​​释【英文标题】:Socket explanation in C and C++ 【发布时间】:2012-04-21 20:26:02 【问题描述】:

我一直想知道是否有 C++ 的标准套接字头文件

我确实搜索了整个互联网(使用谷歌搜索引擎),但找不到任何标准的 C++ 套接字头文件,除了找到一些库,如 Boost、chilkat 等......

我只成功地找到了 C 编程语言的标准套接字头文件。 如果我使用 C 标准套接字头文件,但在我的 C++ 代码中,这是否意味着我的程序 是纯 C++ 还是 C 和 C++?

因为我没有找到任何标准的 C++ 套接字头文件。像 C++ 有<string>,C 有<string.h>,但没有套接字 C++ 的标准头文件。

我希望有 C/C++ 智者能一步一步地为我解释这一切。

【问题讨论】:

为什么你的代码只能是 c 代码,因为你使用了 c 头文件以及你使用的是哪个标准套接字头文件?通常套接字取决于您的操作系统。 这就是为什么我要解释和理解它的原因 没有 C 和 C++ 源文件这样的东西。如果你用 C++ 编译器编译它,它是(解释为)一个 C++ 源文件;如果你用 C 编译器编译它,它是(解释为)一个 C 源文件。 非常小心,您可以混合使用不同编译器创建的目标文件以获得单个可执行文件。 【参考方案1】:

C++ 中没有标准的套接字库。您可以使用操作系统提供的任何套接字 API(通常是 C API,在 Unix 操作系统上为 BSD sockets API),也可以使用跨平台的 C++ 库,如 Boost.ASIO。

【讨论】:

我没有得到我的答案,在我的 C++ 应用程序中使用 C 的标准套接字头文件是否会使其成为 C 和 C++?还是只是 C++? @user1341993,在 C 或 C++ 中没有标准套接字头。 通常,头文件或您的代码提供语法糖,使其能够在 C++ 程序中正常使用,extern 'C',根据parashift.com/c++-faq-lite/mixing-c-and-cpp.html @user1341993:如果您在 C++ 程序中使用 C 套接字 API(请注意,没有标准),它仍然是 C++ 程序。代码的风格可能类似于 C,这可能会或可能不会打扰您,但它仍然是 C++ 程序。【参考方案2】:

BSD sockets 由 Bill Joy 在 70 年代发明,可以说是“标准套接字 API”。

通常,您会包含以下标题:

#include <sys/socket.h> // Core BSD socket functions and data structures.
#include <netinet/in.h> // AF_INET and AF_INET6 address families and their
                        // corresponding protocol families PF_INET and PF_INET6.
#include <arpa/inet.h>  // Functions for manipulating numeric IP addresses.
#include <netdb.h>      // Name resolution

Beej's Guide 是关于套接字(BSD 套接字)编程的优秀教程:

http://beej.us/guide/bgnet/

【讨论】:

【参考方案3】:

如果您包含 c 头文件但使用 c++ 编译您的代码,那么它将生成一个 c++ 应用程序。 您可以使用许多 c++ 框架,例如 Boost::asio、ACE、WinSock 等。这取决于您是否希望您的代码是可移植的,以及您的应用程序是否只能在特定的操作系统上运行,即。 Linux、Mac 或 Windows。

此外,由于 C++ 是 C 的超集,因此使用 C 或 C++ 无关紧要,因为您正在编译 C++ 程序,因此您生成的 C++ 纯粹而简单。

【讨论】:

以上是关于C 和 C++ 中的套接字解​​释的主要内容,如果未能解决你的问题,请参考以下文章

Windows 下 C++ 和 C# 中的套接字无法正常工作

如何使用套接字将Arduino连接到C ++?

Python 3套接字客户端发送数据和C++套接字服务器接收偏移数据?

C++ 中嵌套 C 结构的 offsetof()

具有 REQ 和 REP 套接字的 C++ ZeroMQ 单一应用程序

线程中的套接字接受所有端口连接? C++