C++ 之 SOCKET 通信详解

C++ 之 SOCKET 通信详解

  • SOCKET中首先我们要理解如下几个定义概念:

    • 一是IP地址:IP Address, 就是依照TCP/IP协议分配给本地主机的网络地址, 比如两个进程要通讯,任一进程要知道通讯对方的位置,就用对方的IP。
    • 二是端口号: 用来标识本地通讯进程,方便OS提交数据.就是说进程指定了对方进程的网络IP,但这个IP只是用来标识进程所在的主机,如何来找到运行在这个主机的这个进程呢,就用端口号。
    • 三是连接: 指两个进程间的通讯链路
    • 四是半相关: 网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)
    • 五是全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)
  • 运行模式:

    • 在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
    • 客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户/服务器模式的TCP/IP。
  • 下面详细总结一下 SOCKET 相关原理

1. SOCKET 基础

  • Socket 是计算机网络中的端点,客户端和服务器通过Socket进行通信。每个Socket都是由操作系统提供的一个API,它封装了网络协议栈的各种细节,程序通过调用Socket相关函数来完成数据的发送和接收。

  • Socket的类型在网络编程中,主要有两种Socket类型:

    • TCP Socket (SOCK_STREAM):面向连接的可靠通信。数据以流的形式传输,适用于要求可靠性、顺序传输的应用(如HTTP、FTP等)。
    • UDP Socket (SOCK_DGRAM):无连接的、不可靠的通信方式。数据报文独立发送,不保证顺序、可靠性,适用于对实时性要求较高但对丢包可以容忍的场景(如DNS、视频流、实时游戏等)。
  • Socket是网络通信端点,TCP协议提供可靠连接(类似打电话),UDP协议提供无连接服务(类似发短信)。

  • 完整流程总结

1. ​初始化 Winsock:WSAStartup()2. 创建 Socket:socket()3. 绑定地址​(服务器):bind()4. 监听连接​(TCP 服务器):listen()5. 接受连接​(TCP 服务器):accept()6. 连接服务器​(TCP 客户端):connect()7. 数据传输:send()/recv()sendto()/recvfrom()8. 关闭 Socket:closesocket()9. 清理资源:WSACleanup()

2. 基础接口

1. 初始化与清理

  • WSAStartup()
    ​功能:初始化 Winsock 库,必须在使用其他 Socket 函数前调用。
  • ​函数原型:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

​参数: wVersionRequested:请求的 Winsock 版本(如 MAKEWORD(2, 2) 表示 2.2 版本)。
lpWSAData:指向 WSADATA 结构的指针,用于返回库的详细信息。
​返回值:成功返回 0,失败返回非零错误码。

  • ​示例:
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
   
    std::cerr << "WSAStartup 失败,错误码: " << WSAGetLastError() << std::endl;
    return 1;
}
  • WSACleanup()
    ​功能:清理 Winsock 库资源,程序退出前调用。
  • ​函数原型:
int WSACleanup();

​返回值:成功返回 0,失败返回 SOCKET_ERROR。 ​
注意事项:必须与 WSAStartup() 成对使用。

2. Socket 的创建与关闭

  • socket()
    ​功能:创建 Socket 句柄。
    ​- 函数原型:
SOCKET socket(int af, int type, int protocol);

​参数: af:地址族(如 AF_INET 表示 IPv4,AF_INET6 表示 IPv6)。
type:Socket 类型(SOCK_STREAM 为 TCP,SOCK_DGRAM 为 UDP)。
protocol:协议类型(通常设为 0,系统自动选择)。
​返回值:成功返回 SOCKET 句柄,失败返回 INVALID_SOCKET。

​- 示例:

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
   
    std::cerr << "socket 失败,错误码: " << WSAGetLastError() << std::endl;
}
  • closesocket()
    ​功能:关闭 Socket 句柄(Windows 专用,替代 close())。
  • ​函数原型:
int closesocket(SOCKET s);

​返回值:成功返回 0,失败返回 SOCKET_ERROR。

你可能感兴趣的:(c++,开发语言,cuda,c语言)