Socket基本操作的C++封装
这篇文章通过一个可运行的 C++ 封装案例,把 TCP 套接字从接口抽象、服务端/客户端实现到实际通信示例串成了完整路径。封装目标与接口层设计先抽象出 TCP_INTERFACE,统一 Send/Recv/Close/error_die 行为,并在构造/析构中管理 WinSock 初始化与清理。通过 _public_s…
封装过程接口类的实现(抽象类)_public_socket.h 该头文件用于包含所有该系统平台socket所需要依赖的库。windows平台#ifndef MY_TINY_STL__PUBLIC_SOCKET_H #define MY_TINY_STL__PUBLIC_SOCKET_H #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll #endif //MY_TINY_STL__PUBLIC_SOCKET_H Linux平台#include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> TCP_INTERFACE.h(作用于win平台) 由于该接口由服务器端和客户端继承,而两者同样的函数成员也就是这些了,设计客户端和服务器端时就只需要考虑各自的套接字以及其余操作的成员函数,也不需要管理DLL的开关。 还有一个erro_die()成员函数用于阻断错误并打印对应情况。// // Created by Alone on 2021/8/17. // #ifndef MY_TINY_STL_TCP_INTERFACE_H #define MY_TINY_STL_TCP_INTERFACE_H #include <cstdio> #include "_public_socket.h" class TCP_INTERFACE { public: TCP_INTERFACE() { //初始化 DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); } //返回值小于等于0时发生错误 virtual int Send(SOCKET clnt, const void *buf, const int buflen) = 0; virtual int Recv(SOCKET clnt, void *buf, const int buflen) = 0; //closesocket返回值不为0则发生错误 virtual void Close(SOCKET clnt) = 0; virtual void error_die(const char *str) = 0; ~TCP_INTERFACE() { WSACleanup(); } }; #endif //MY_TINY_STL_TCP_INTERFACE_H 服务器端封装 这次修改了下逻辑,还是用accept返回一个套接字进行发送和接收操作比较好。类的底层没有再保留用于和某个客户端通信的套接字了,自己控制各个客户端套接字的关闭和使用。TCP_SOCKET_SERVER.h// // Created by Alone on 2021/8/16. // #ifndef MY_TINY_STL_TCP_SOCKET_SERVER_H #define MY_TINY_STL_TCP_SOCKET_SERVER_H #include "TCP_INTERFACE.h" class TCP_SOCKET_SERVER : public TCP_INTERFACE { public: TCP_SOCKET_SERVER(); ~TCP_SOCKET_SERVER(); void Bind(int port); void Listen(); SOCKET Accept(); int Send(SOCKET clnt, const void *buf, const int buflen); int Recv(SOCKET clnt, void *buf, const int buflen); void Close(SOCKET clnt); void error_die(const char *str); private: SOCKET servSock; sockaddr_in sockAddr; }; #endif //MY_TINY_STL_TCP_SOCKET_SERVER_H TCP_SOCKET_SERVER.cpp// // Created by Alone on 2021/8/16. // #include "TCP_SOCKET_SERVER.h" //初始化操作 TCP_SOCKET_SERVER::TCP_SOCKET_SERVER() : servSock(0) { memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充 } //绑定操作 void TCP_SOCKET_…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行