【C++】Socket网络编程

C++网络编程:使用YAML与yaml-cpp实现Socket配置管理 在软件工程中,配置管理是分离代码逻辑与运行参数的核心实践,旨在提升项目的可维护性与部署灵活性。其原理在于将易变的配置信息(如地址、端口、超时时间)从编译后的二进制文件中剥离,通过外部文件进行动态加载。这一技术价值在于实现了环境无感知的部署,支持开发、测试、生产环境的无缝切换,并便于团队协作与运维管理。常见的应用场景包括服务器参数调优、多环境部署以及微服务架构中的配置中心集成。本文聚焦于C++网络编程领域,详细阐述了如何利用YAML配置文件和yaml-cpp库,构建一个类型安全、支持热重载的Socket服务器 阅读详情

本文将介绍

①Socket是什么
②Socket与TCP/IP的关系
③Socket编程中具体接口的用法 Bind() Connect() Accept() etc..
④Socket编程示例(VS2015)下载示例

1. Socket(套接字)是什么

Socket(套接字)是指通讯设备的连接端点,不用于网口、USB端口这样的端点是实质的,套接字是虚拟的,包含了通讯所需的信息的端口。套接字有很多种,本文主要介绍Internet套接字。Internet套接字包含网络通讯必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远程主机的IP地址,远程主机进程的协议端口。
Internet套接字有以下几种:
SOCK_STREAM:流式套接字,提供面向连接的稳定数据流传输,即TCP协议。
SOCK_DGRAM:数据报套接字,使用不连续不可靠的数据包连接,即UDP协议。
SOCK_SEQPACKET:有序分组套接字,提供连续可靠的数据包连接。
SOCK_RAW:原始套接字,允许对底层协议直接访问,如IP/ICMP协议等。
SOCK_RDM:提供可靠的数据包连接。
SOCK_PACKET:与网络驱动程序直接通信。

2. Socket与TCP/IP关系

关于TCP/IP
相信很多人都听过Socket(套接字)和TCP/IP,两者总是一起出现,好似是同一个东西,但我们都知道它们是不一样的,那究竟两者有什么关系
Socket包含了连接使用的协议,这个协议指的就是TCP/IP协议族。TCP/IP协议族不只是TCP和IP,它可以详细分为四层,每层上有不同的协议,对应ISO-OSI七层网络模型。

OSI七层网络模型

TCP/IP四层概念模型  

对应网络协议

应用层(Application)

应用层

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示层(Presentation)

Telnet, Rlogin, SNMP, Gopher

会话层(Session)

SMTP, DNS

传输层(Transport)

传输层

TCP, UDP

网络层(Network)

网络层

IP, ICMP, ARP, RARP, AKP, UUCP

数据链路层(Data Link)

数据链路层

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

物理层(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

TCP/IP内容非常庞大,此处不展开讲解,后面文章会详细讲解TCP/IP协议族。此处下载《TCP/IP协议详解 - 第五版》  点击打开链接

TCP/IP协议族之间的抽象关系可用下图表示

图自《TCP/IP协议详解 - 卷一》第一章1.3

那么Socket在哪里?其实Socket是一套API函数,这套函数实现了上面的通讯过程。
固然我们可以按照上图所示,把每个协议功能都实现,但这样太繁琐了,软件不易于改动扩展。于是UNIX BSD就发明了socket,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。它对内封装了TCP/IP协议,对外提供一套统一的接口,我们只需调用接口即可实现TCP/IP协议的通讯过程。看下图示意

<例子>TCP通讯的Socket编程抽象过程

Socket编程中最常见的是TCP编程,下面以TCP协议为例,简述客户端和服务端的Socket函数调用过程,其他协议编程类似。

客户端过程:
1. Socket()建立Soocket套接字,指定套接字类型。
2. Connect()用IP和Port建立连接,指定协议族内容,连接方法等。TCP连接有三次握手过程,封装在Ws2_32.dll内部。函数只在客户端中使用。
3. Write()连接成功,向服务器发送数据,数据以ANSI形式发送。
4. Read()读取服务器返回数据,例如发送命令后处理结果OK/NG。
5. Close()客户端关闭连接,TCP断开有四次挥手过程,封装在Ws2_32.dll内部。

服务器过程:
1. Socket()建立Soocket套接字,指定套接字类型。
2. Bind()将套接字绑定到指定IP和Port上,只在服务器中使用。
3. Listen()服务器监听客户端的连接,一个服务器可以监听多个客户端。
4. Accept()服务器同意客户端的连接,与客户端的Connect()函数对应,这两个配套函数分别在各自的程序中被成功调用后就可以收发数据了。
5. Read()读取来自客户端的数据。
6. Write()处理完客户端数据后,(如有需要)向客户端返回数据。
7. Read()客户端调用了Close() 后会发送断开信息,服务器回应断开该链接。
8. Close()关闭服务器。

实际使用中,服务器不随着客户端Close() 而关闭,仅仅断开对应的连接(Shutdown)。服务器不断监听客户端的连接请求,当有连接请求时建立双向连接,客户端向服务器交互信息。客户端关闭时断开连接,服务器继续监听连接请求。

3. Socket编程中具体接口的用法

Socket的函数很多,Windows中头文件是Winsock2.h,下面介绍经常使用的几个。

Socket()接口
SOCKETWSAAPI socket(
    _In_ int af,
    _In_ int type,
    _In_ int protocol
    );

功能:创建一个套接字

① af 指地址族,通常使用
    AF_INET:                   采用IPV地址
    AF_INET6:                采用IPV6地址
    AF_LOCAL/AF_UNIX:使用绝对路径名
    AF_ROUTE:               路由套接字
    AF_KEY:                    秘钥套接字
    补充:AF_是地址族(Address Family),PF_是协议族(Protocol Family),通常它们是一样的,例如AF_INET与PF_INET都表示IPV4地址,但在Unix中个别字段有差异。历史上曾想以单个协议族表示多个地址族,最终没成功。
② type表示socket类型,通常使用
    SOCK_STREAM:       流式套接字,提供面向连接的稳定数据流传输,即TCP协议。
    SOCK_DGRAM:        数据报套接字,使用不连续不可靠的数据包连接,即UDP协议。
    SOCK_SEQPACKET: 有序分组套接字,提供连续可靠的数据包连接。
    SOCK_RAW:             原始套接字,允许对底层协议直接访问,如IP/ICMP协议等。
    SOCK_RDM:             提供可靠的数据包连接。
    SOCK_PACKET:        与网络驱动程序直接通信。

③ protocol表示具体的协议,通常使用
    IPPROTO_TCP:         tcp传输协议
    IPPROTO_UDP:        udp传输协议
    IPPROTO_SCTP:      sctp传输协议
    protocol一般选0,表示使用family和type组合所选择的协议。常用组合有
    AF_INET+SOCK_STREAM = IPPROTO_TCP/IPPROTO_SCTP
    AF_INET+SOCK_DGRAM = IPPROTO_UDP
    AF_INET+SOCK_SEQPACKET = IPPROTO_SCTP
    AF_INET+SOCK_RAW = IPv4

   但不是所有的组合都有意义

Bind()接口
int WSAAPIbind(
    _In_ SOCKET s,
    _In_reads_bytes_(namelen) const structsockaddr FAR * name,
    _In_ int namelen
    );

功能:将本地协议地址绑定一个Socket,Socket将使用这个地址进行通信。
① SOCKETs表示socket()函数创建的socket描述符
② name表示具体的地址

//SOCKADDR_IN结构体设置IPv4地址
typedef  struct  sockaddr_in{
    ADDRESS_FAMILYsin_family; // AF_INET
    USHORTsin_port; // 设置端口
    IN_ADDRsin_addr; // 设置IP地址
    CHARsin_zero[8];
    }
//SOCKADDR_IN6结构体设置IPv6地址
typedef  struct  sockaddr_in6{
    ADDRESS_FAMILYsin6_family; // AF_INET6.
    USHORTsin6_port;           // 设置端口.
    ULONG  sin6_flowinfo;       // IPv6 flow information.
    IN6_ADDRsin6_addr;         // IPv6 地址.
    union{
    ULONGsin6_scope_id;     // Set of interfacesfor a scope.
    SCOPE_IDsin6_scope_struct;
    };
}

③ namelen表示结构体地址长度,用sizeof()可求得。 

Listen()接口
int WSAAPIlisten(
    _In_ SOCKET s,
    _In_ int backlog
    );
功能:服务器调用,将一个未连接的套接字变为被动套接字,告知套接字监听是否有连接到来。

①   SOCKETs表示socket()函数创建的socket描述符
②   backlog指定最大的连接客户端数量

Connect()接口
int WSAAPIconnect(
    _In_ SOCKET s,
    _In_reads_bytes_(namelen) const structsockaddr FAR * name,
    _In_ int namelen
    );
功能:客户端调用,用于客户端与服务器连接。参数含义与Bind()相似。
① SOCKETs表示socket()函数创建的socket描述符
② name表示具体的地址
    SOCKADDR_IN结构体设置IPv4地址
    SOCKADDR_IN6结构体设置IPv6地址

③ namelen表示结构体地址长度,用sizeof()可求得。

Accept()接口
SOCKETWSAAPI accept(
    _In_ SOCKET s,
    _Out_writes_bytes_opt_(*addrlen) structsockaddr FAR * addr,
    _Inout_opt_ int FAR * addrlen
    );

功能:服务器调用,客户端发出Connect()请求后,会形成Accept连接队列,服务器从连接队列中取出一个连接,通过该函数生成新的Socket描述符,这个新的描述符将被拿来供客户端与服务器交互数据。
① SOCKETs表示socket()函数创建的socket描述符
② addr(输出参数),表示新的套接字描述符的地址信息
③ addrlen(输出参数),表示新的套接字描述符的地址长度
④ 函数返回SOCKET s,返回一个新的套接字,这个套接字用在下面的发送/接收消息。

Write/Read 发送数据&接受数据

Send()函数

int WSAAPIsend(
    _In_ SOCKET s,
    _In_reads_bytes_(len) const char FAR * buf,
    _In_ int len,
    _In_ int flags
    );

功能:客户端与服务器之间发送数据
① SOCKETs表示accept()函数返回的socket描述符
② buf表示发送的字节内容
③ len表示发送内容的字节长度
④ flags标识位,一般置0,但某些场景需要设置标识

Recv()函数

int WSAAPIrecv(
    _In_ SOCKET s,
    _Out_writes_bytes_to_(len, return)__out_data_source(NETWORK) char FAR * buf,
    _In_ int len,
    _In_ int flags
    );

① SOCKETs表示accept()函数返回的socket描述符
② buf表示接收的字节内容
③ len表示接受内容的buffer长度,必须比接收的内容大
④ flags 标识位,一般置0,但某些场景需要设置标识

关于标识位字段:
MSG_PEEK,可以用于recv、recvfrom查看已可读取的数据,读取完成后不丢弃数据,Recv()可用
MSG_DONTROUTE,目的主机在某个直连的本地网络上,不经过路由表查找,Send()可用
MSG_OOB,发送或接收带外数据,Send()、Recv()可用
MSG_WAITALL,告诉内核不要在未读完指定的字节前返回,Recv()可用
MSG_DONTWAIT,仅本操作非阻塞,Recv()、send()可用,Windows系统不支持

关于带外数据介绍:
http://blog.163.com/clevertanglei900@126/blog/static/111352259201122142545411/

Sendto()函数

int WSAAPIsendto(
    _In_ SOCKET s,
    _In_reads_bytes_(len) const char FAR * buf,
    _In_ int len,
    _In_ int flags,
    _In_reads_bytes_(tolen) const structsockaddr FAR * to,
    _In_ int tolen
    );

功能:用于UDP中发送报文,返回值表示发送的数据数量。
① SOCKETs表示accept()函数返回的socket描述符
② buf表示发送的字节内容
③ len 表示发送内容的字节长度
④ flags 标识位,一般置0,但某些场景需要设置标识
⑤ to发送数据到指定地址,表示数据报将发送何处(UDP)或者与之建立连接到协议地址(TCP)
⑥ tolen发送表的长度

Recvform()函数

int WSAAPIrecvfrom(
    _In_ SOCKET s,
    _Out_writes_bytes_to_(len, return)__out_data_source(NETWORK) char FAR * buf,
    _In_ int len,
    _In_ int flags,
    _Out_writes_bytes_to_opt_(*fromlen,*fromlen) struct sockaddr FAR * from,
    _Inout_opt_ int FAR * fromlen
);

功能:用于UDP中接收报文,返回值表示接收到数据数量
① SOCKETs表示accept()函数返回的socket描述符
② buf表示接收的字节内容
③ len表示接受内容的buffer长度,必须比接收的内容大
④ flags 标识位,一般置0,但某些场景需要设置标识
⑤ from输出参数,表明了是谁发送了数据报(UDP)或者是谁发起了连接(TCP)
⑥ from参数表的长度,必须比收到的参数内容大

Close()接口
int WSAAPIclosesocket(
    _In_ SOCKET s
    );

功能:用于关闭套接字。执行完关闭后,套接字将不再允许任何读写操作。
① SOCKETs表示需关闭的套接字

Shutdwown()
int WSAAPIshutdown(
    _In_ SOCKET s,
    _In_ int how
    );
功能:支持更高级的关闭操作, 利用shutdown,可以实现tcp连接半关闭

① SOCKET s表示需关闭的套接字
② how 标识符
    SD_RECEIVE  不允许数据接收
    SD_SEND 不允许数据发送
    SD_BOTH 不允许接受或发送,同Close()

Close()接口
int WSAAPIclosesocket(
    _In_ SOCKET s
 );

功能:用于关闭套接字。执行完关闭后,套接字将不再允许任何读写操作
①   SOCKETs表示需关闭的套接字

Shutdwown()
int WSAAPIshutdown(
    _In_ SOCKET s,
    _In_ int how
    );

功能:支持更高级的关闭操作, 利用shutdown,可以实现tcp连接半关闭
① SOCKET s表示需关闭的套接字
② how 标识符
    SD_RECEIVE  不允许数据接收
    SD_SEND 不允许数据发送
    SD_BOTH 不允许接受或发送,同Close()

获取地址协议接口

Getsockname()函数

int WSAAPIgetsockname(
    _In_ SOCKET s,
    _Out_writes_bytes_to_(*namelen,*namelen)struct sockaddr FAR * name,
    _Inout_ int FAR * namelen
    );

功能:获取与socket相关的本地协议地址,只有在连接建立以后才调用,成功返回0,失败返回-1。
① SOCKET s表示需操作的socket描述符
② name 输出参数,返回的本地地址信息,IP和Port等
③ namelen地址结构体的长度,必须比返回信息表长

Getpeername()函数

int WSAAPIgetpeername(
    _In_SOCKET s,
    _Out_writes_bytes_to_(*namelen,*namelen)struct sockaddr FAR * name,
    _Inout_ int FAR * namelen
);

功能:获取与socket相关的对端协议地址,只有在连接建立以后才调用,成功返回0,失败返回-1。
① SOCKET s表示需操作的socket描述符
② name 输出参数,返回的对端地址信息,IP和Port等
③ namelen地址结构体的长度,必须比返回信息表长

4. Socket编程示例

本示例使用VS2015编写,用ANSI字符集,Unicode字符集需要宽转窄字符,搭建相互通讯的TCP客户端和服务器。TCP通讯与UPD通讯在Socket中实现方法相同,选择不同的标识字段可切换。

============= 客户端 =============

// 输入IP和Port建立连接
BOOL Connect(CString strIP, int iPort)
{
	WORD wVersionRequested;
	WSADATA wsaData;
	// 向操作系统说明,需要用2.2版本的Socket,绑定相应的库
	wVersionRequested = MAKEWORD(2, 2);	
	if (WSAStartup(wVersionRequested, &wsaData) == 0)
	{
		return TRUE;
	}
	else
	{
		// 解除Socket库的绑定,释放资源
		WSACleanup();
		return FALSE;
	}
	const char* pstr = strIP;
	// 将IP和Port转为sockaddr结构体
	struct sockaddr_in client; 
	memset(&client, 0, sizeof(client));
	client.sin_family = AF_INET; // IPV4
	client.sin_port = htons(iPort); // 设置端口
	inet_pton(client.sin_family, pstr, &(client.sin_addr)); // 设置IP
	// 新建一个socket
	m_sSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (m_sSocket == INVALID_SOCKET)
	{
		error = WSAGetLastError();
		return FALSE;
	}
	// 连接
	if (connect(m_sSocket, (LPSOCKADDR)&client, sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		error = WSAGetLastError();
		closesocket(m_sSocket);
		m_sSocket = NULL;
		return FALSE;
	}
	m_bCreated = TRUE;
	return TRUE;
}
// 输入信息内容和长度,向服务器发送信息
int SendClient(char* data, int length)
{
	int nRet = send(m_sSocket, data, length, 0);
	if (nRet == SOCKET_ERROR)
	{
		error = WSAGetLastError();
	}
	return nRet;
}
// 关闭连接
void Close()
{
	shutdown(m_sSocket, SD_RECEIVE);
	closesocket(m_sSocket);
	m_sSocket = NULL;
	m_bCreated = FALSE;
	WSACleanup();
}

============= 服务器 =============

服务器比客户端复杂,需要开启线程监听客户端请求,连接成功后保持与客户端的信息互动。

// 用IP和Port创建服务器 
BOOL	mysocket::Create(CString strIP, int iPort)
{
	WORD wVersionRequested;
	WSADATA wsaData;
	// 向操作系统说明,需要用2.2版本的Socket,绑定相应的库
	wVersionRequested = MAKEWORD(2, 2);	
	if (WSAStartup(wVersionRequested, &wsaData) == 0)
	{
		return TRUE;
	}
	else
	{
		// 解除Socket库的绑定,释放资源
		WSACleanup();
		return FALSE;
	}
	const char* pstr = strIP;
	m_sockMain = socket(AF_INET, SOCK_STREAM, 0); // IPV4 & TCP
	if (m_sockMain == INVALID_SOCKET) // WASStartup
		return FALSE;

	SOCKADDR_IN	addrRobot;
	memset(&addrRobot, 0, sizeof(addrRobot));
	addrRobot.sin_family = AF_INET; // Ipv4
	addrRobot.sin_port = htons(iPort);

	// inet_pton 将ip绑定到addrRobot.sin_addr
	INT iRe = inet_pton(addrRobot.sin_family, pstr, &(addrRobot.sin_addr));
	if (iRe < 1)
		return FALSE;
	if (SOCKET_ERROR == bind(m_sockMain, (LPSOCKADDR)&addrRobot, sizeof(addrRobot)))
	{
		closesocket(m_sockMain);
		m_sockMain = INVALID_SOCKET;
		return FALSE;
	}
	if (SOCKET_ERROR == listen(m_sockMain, 5))
	{
		closesocket(m_sockMain);
		m_sockMain = INVALID_SOCKET;
		return FALSE;
	}
	SetEvent(m_hEventListenning);
	CreateThread(NULL, 0, ThreadListen, this, 0, &m_ulListen);
	return TRUE;
}

// 监听使用线程,监听到客户端连接后(accept())),开启子线程接收客户端的信息。这样可继续监听其他客户端的连接。
DWORD WINAPI ThreadClient(LPVOID pParam);
DWORD WINAPI ThreadListen(LPVOID pParam);

DWORD WINAPI ThreadListen(LPVOID pParam)
{
	mysocket* pServer = (mysocket*)pParam;
	if (pServer == NULL)
		return 0;

	closesocket(pServer->m_sockClient);
	pServer->m_sockClient = INVALID_SOCKET;
	SOCKADDR_IN addrRobot;
	int len = sizeof(SOCKADDR_IN);

	while (!pServer->IsStopListenning())
	{
		if (!pServer->HasClient())
		{
			pServer->m_sockClient = accept(pServer->m_sockMain, (LPSOCKADDR)&addrRobot, &len);
			if (INVALID_SOCKET == pServer->m_sockClient)
			{
				break;
			}
			// 与客户端交互
			SetEvent(pServer->m_hEventClient);
			CreateThread(NULL, 0, ThreadClient, pServer, 0, &pServer->m_ulClient);
			Sleep(100);
		}
		Sleep(50);
	}
	pServer->Close();

	return 0;
}

DWORD WINAPI ThreadClient(LPVOID pParam)
{
	mysocket* pServer = (mysocket*)pParam;
	if (pServer == NULL)
		return 0;
	pServer->Interaction();
	return 0;
}
// 交互
void	mysocket::Interaction()
{
	int iRecv;
	char szRecv[MAX_PATH * 2];
	memset(szRecv, 0, sizeof(szRecv));
	while (HasClient())
	{
		if (m_sockClient == INVALID_SOCKET)
		{
			break;
		}

		memset(szRecv, 0, sizeof(szRecv));
		// 接收
		iRecv = recv(m_sockClient, szRecv, sizeof(szRecv), 0);
		if (0 == iRecv || SOCKET_ERROR == iRecv)
		{
			break;
		}
		m_strRecv = szRecv;
		//...//
		// 处理客户端数据 if(strRecv == "RUN") then...
		// 处理完毕返回消息给客户端  SendString("OK")
		//...//
	}
	closesocket(m_sockClient);
	ResetEvent(m_hEventClient);
}

// 客户端断开连接,会退出ThreadClient线程,监听线程仍继续。直到程序结束,关闭服务器。
// 关闭服务器
void	mysocket::Close()
{
	closesocket(m_sockMain);
	closesocket(m_sockClient);

	ResetEvent(m_hEventClient);
	Sleep(50);
	ResetEvent(m_hEventListenning);
	Sleep(50);
	WSACleanup();
	m_sockClient = INVALID_SOCKET;
	m_sockMain = INVALID_SOCKET;
}

具体实现工程请下载示例


C++SOCKET多线程网络编程实现多个客户端与服务器通信 C++SOCKET多线程网络编程实现多个客户端与服务器通信 #设计思路 通过在服务器端建立两个线程,主线程用来监听客户端的接入,当有新的客户端接入时,服务器为新的客户端建立服务线程,通过服务线程来实现服务器与客户端的通信。 #结果演示 服务器端代码: #include&amp;quot;stdafx.h&amp;quot; #include &amp;amp;lt;cstdio&amp;amp;gt; #include&amp;amp;lt;io 阅读详情

相关推荐

C++ HTTP客户端开发指南:从Socket到高性能网络编程实践

HTTP协议作为应用层通信的核心标准,其本质是在TCP/IP协议栈之上构建的请求-响应模型,通过定义统一的方法、状态码和头部字段,实现了跨平台的数据交换。理解其工作原理,关键在于掌握TCP连接管理、消息格式解析与状态机处理。对于C++开发者而言,直接实现HTTP传输能带来极致的性能控制和系统集成深度,这在金融交易、实时游戏同步等对延迟和吞吐量有严苛要求的场景中价值显著。通过选择如cpp-httplib进行快速原型开发,或深入使用Boost.Beast构建异步、可复用连接池的高性能客户端,开发者能够应对物联网

weixin_31292729的博客 332

C++项目实战-socket编程

假设我们让发送数据的一端总是以大端字节序发送(对就是做一个统一的规定),那么接收数据的一端就知道我接受到的字节序总是大端字节序,如果接受方的字节序为小端,那么只需要大端数据装换成小端字节序就可以了。因此,Linux定义了下面这个新的通用的socket地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的【内存对齐可以加快CPU访问速度,内存对齐问题见我的C语言专栏,有详细介绍】socket本意上“插座”的意思,在Linux环境中,用于表示进程间网络通信的特殊文件类型。...

weixin_46120107的博客 1万+

群晖设置公网ipv6方式域名解析访问

群晖、IPV6、域名解析

爬山虎的博客 2万+

C++ Socket 编程

C++ Socket 编程

m0_60259116的博客 3061

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

Android15 AndroidV冻结和解冻的场景

cgroup 最初由 Google 工程师 Paul Menage 和 Rohit Seth 在 2006 年提出,是一种细粒度资源控制的Linux内核机制。于 2007 年合并到 Linux 内核主线中。然而 Google 原生系统直到 Android 11 或更高版本上才支持 CACHE 应用的 CPU 冻结功能。当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。

苏法迪的专栏 1786

C/C++socket网络编程

socket多进程编程,tcp和udp流程图,socket函数, bind函数,listen函数,accept函数,connect函数,recv、recvfrom、read函数,send、write、sendto、sendmsg函数,close、shutdown函数,htonl、ntohl、htons、ntohs本地主机和网络字节序转换,inet_addr、inet_aton、inet_ntop,IP地址转换,setsockopt,fcntl,getpeername与getsockname

weixin_40355471的博客 9269

【sealos安装指南】基于 Sealos 安装 Kubernetes 1.33.6 高可用集群

本文介绍使用Sealos工具快速搭建Kubernetes集群的详细指南。Sealos简化了K8s部署流程,自动完成系统调优,适合新手学习使用。文章提供了服务器规划、环境准备、在线/离线两种安装方式的具体步骤,包括主机名设置、swap关闭、数据目录配置等。重点讲解了Sealos的安装命令参数说明,以及添加/删除节点等常用操作。推荐使用Calico网络组件确保稳定性,并附有安装成功后的验证截图。该指南能帮助用户快速搭建一个包含master和worker节点的K8s集群,底层基于containerd运行。

欢迎你们到来,希望能帮到大家 462

C++网络编程(一)本地socket通信

简单描述C++网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节

QYQHxyh的博客 5457

Android Binder的两三事--基于Android14源码

Android14-Framework-Binder

保持专注,保持热爱 1140

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 479

C++学习之网络通信Socket技术

C++之网络通信socket学习

Significance的博客 5492

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 154

socket-cpp:简易的C++网络编程库

socket-cpp:简易的C++网络编程库 socket-cpp 是一个用 C++ 编写的简易 TCP 服务器/客户端库,旨在提供一个创建 TCP 服务器或客户端的便携式且易于使用的 API,支持 SSL/TLS 加密。该项目主要使用 C++ 语言开发。 核心功能 该项目提供了以下核心功能: 跨平台支持:在 Windows 平台下封装了 WinSock API,在 Linux 平台下封装了相关...

gitblog_00616的博客 561

Langchain cannot connect with Azure SQL Database

Langchain 无法连接到 Azure SQL 数据库

suiusoar 633

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++网络编程之Socket

在C++网络编程中,Socket是实现网络通信的核心工具,C++本身并没有直接提供socket接口,而是通过操作系统提供的来实现网络通信。下面将详细介绍一下如何用C++进行socket编程。Socket 是网络编程的核心工具,掌握其基本概念和工作流程对于开发网络应用至关重要。如有错误,敬请指正!!!

qq_55527904的博客 2219

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++ socket网络编程

你打电话问书店老板有没有《网络编程》这本书,老板去书架上找,如果是阻塞式调用,你就会把自己一直挂起,守在电话边上,直到得到这本书有或者没有的答案。如果是非阻塞式调用,你可以干别的事情去,隔一段时间来看一下老板有没有告诉你结果。同步异步是对书店老板而言(同步老板不会提醒你找到结果了,异步老板会打电话告诉你),阻塞和非阻塞是对你而言。

WHEgqing的专栏 469

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c++应用网络编程之八SOCKET探究

我们分析完成了一般网络通信的原理和相关的IO通信的机制,已经基本明白了网络通信到底是怎么一回事,以及其相关的难点和重点。国内的教科书往往有一个重要的问题,就是从来不连贯的讲述一个知识点,而是将这些知识点打乱并且乱序讲解。这样做很难让一个人把网络通信的相关知识融会贯通。换句话说,基本上靠自觉把相关的体系建立起来的可能性极小。这也是本系列一开篇并没有像传统的书本把网络基础知识大讲一通,然后再搞几个IO模型举几个例子,基本上这书就过去了。

fpcc的专栏 1813

C++网络编程Socket封装

关于C++网络编程简单功能的的socket封装 server端#pragma once class Socket { public: Socket(char* ip,int port) { this->ip = ip; this->port = port; //绑定套接字 } Socket() { }

hello_bravo_的博客 2640

Windows10 下C/C++网络编程基本:socket实现tcp的例子

1.说明 待编辑… 2.代码 test_server.h #ifndef INCLUDE_TEST_SERVER_H #define INCLUDE_TEST_SERVER_H #include <stdio.h> #include <stdlib.h> #include <string> #include <string.h> #include <vector> //Windows 下的 socket 程序依赖 Winsock.dll 或 w

weixin_38425390的博客 682

Socket网络编程C++

整理自这些网页: https://blog.youkuaiyun.com/JHC23/article/details/98055883 https://blog.youkuaiyun.com/qq_38291480/article/details/107458246 https://www.cxyzjd.com/article/freee12/114411950 https://cizixs.com/2015/03/29/basic-socket-programming/ https://www.codenong.com/cs10

landscape 南北——的博客 1031

C/C++ Socket网络编程 介绍

Socket(套接字)是操作系统提供的网络通信编程接口,是应用层与传输层之间的桥梁。│ 应用层 (HTTP/FTP/DNS)│ Socket 接口 ← 我们编程的位置│ 传输层 (TCP/UDP)│ 网络层 (IP/ICMP)│ 网络接口层 (以太网/WiFi)1) Socket的作用通信信道:Socket 为网络中的数据传输提供了一个虚拟信道,数据可以通过这个信道从发送方传输到接收方地址识别:通过 IP 地址和端口号,Socket 能够标识网络中的特定设备和应用程序协议兼容性。

qq_42561732的博客 829

C++socket网络编程笔记

本文实现用C++实现socket通信,主要包含TCP/IP和UDP,简要介绍了socket的windows和linux使用的区别,并使用socket搭建了一个简单的http服务器,可以实现浏览器访问服务器进行通信。主要涉及技术包括:socket通信、tcp/ip、udp、http、多线程等。

qq_45041871的博客 1270

C++网络编程实战:从零掌握Socket通信

简单来说,Socket可以看作是两个程序之间进行通信的端点,它提供了程序内部与外界通信的端口,并为通信双方建立了数据传输通道。与基于"请求-响应"模式的HTTP通信不同,Socket通信在双方建立起连接后就可以直接进行数据的双向传输,支持信息的主动推送,而不需要客户端每次都向服务器发送请求。多线程编程允许开发者将复杂的任务分解为多个独立的线程,使其并行执行,从而充分利用多核处理器的优势。在网络编程中,我们可以为每个客户端连接创建一个独立的线程,这样即使某个连接的处理被阻塞,也不会影响其他连接的正常通信。

2503_94025595的博客 539

C/C++的网络编程基础(SOCKET)

C/C++网络基础(Socket) 简单的创建服务端和客户端,并且通过客户端发送消息到客户端 但是不知道为什么,要输入三遍才能完全退出客户端和服务端

m0_71652268的博客 634

看完之后保证你对socket编程步骤胸有成竹。 C++ Socket网络编程基础详解(TCP)

本文中我会根据windows下中使用C++以及socket进行网络编程的步骤,一步步的讲解网络编程的步骤,以及这些步骤中涉及到的定义,方法。力求你看完之后对socket编程步骤胸有成竹。

weixin_45704279的博客 5115
上一篇: 【C++】gsoap访问WebService
下一篇: 【C++】解析Json - Jsoncpp使用讲解
不知鲸又是鱼
博客等级 码龄10年 16粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值