亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux?C/C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具

 更新時(shí)間:2023年10月31日 09:17:41   作者:程序猿編碼  
網(wǎng)絡(luò)流量分析的原理基于對(duì)數(shù)據(jù)包的捕獲、解析和統(tǒng)計(jì)分析,通過(guò)對(duì)網(wǎng)絡(luò)流量的細(xì)致觀察和分析,幫助管理員了解和優(yōu)化網(wǎng)絡(luò)的性能,本文將通過(guò)C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具,有需要的可以參考下

網(wǎng)絡(luò)流量分析的原理基于對(duì)數(shù)據(jù)包的捕獲、解析和統(tǒng)計(jì)分析,通過(guò)對(duì)網(wǎng)絡(luò)流量的細(xì)致觀察和分析,幫助管理員了解和優(yōu)化網(wǎng)絡(luò)的性能、提高網(wǎng)絡(luò)安全性,并快速排查和解決網(wǎng)絡(luò)故障和問(wèn)題。

Linux中的網(wǎng)絡(luò)流量常見類型

在Linux中,網(wǎng)絡(luò)流量可以分為幾種不同的類型。以下是一些常見的網(wǎng)絡(luò)流量類型:

TCP流量:TCP(傳輸控制協(xié)議)是一種可靠的、面向連接的協(xié)議。TCP流量通常用于傳輸可靠的數(shù)據(jù),例如網(wǎng)頁(yè)瀏覽、文件傳輸?shù)取?/p>

UDP流量:UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是一種無(wú)連接的協(xié)議,不保證數(shù)據(jù)的可靠性和順序。UDP流量通常用于實(shí)時(shí)應(yīng)用,如VoIP(網(wǎng)絡(luò)電話)、視頻流傳輸?shù)取?/p>

ICMP流量:ICMP(Internet控制消息協(xié)議)用于傳輸網(wǎng)絡(luò)控制消息和錯(cuò)誤報(bào)告。ICMP流量通常用于網(wǎng)絡(luò)故障排查、Ping命令等。

HTTP流量:HTTP(超文本傳輸協(xié)議)是一種應(yīng)用層協(xié)議,用于在Web瀏覽器和服務(wù)器之間傳輸數(shù)據(jù)。HTTP流量通常用于網(wǎng)頁(yè)瀏覽、下載文件等Web應(yīng)用。

HTTPS流量:HTTPS是HTTP的安全版本,使用SSL(安全套接字層)或TLS(傳輸層安全)協(xié)議加密通信。HTTPS流量通常用于安全的Web傳輸,例如在線銀行、電子商務(wù)等。

DNS流量:DNS(域名系統(tǒng))用于將域名與IP地址相互映射。DNS流量通常用于解析域名、獲取IP地址等。

FTP流量:FTP(文件傳輸協(xié)議)用于在客戶端和服務(wù)器之間傳輸文件。FTP流量通常用于文件上傳、下載等。

SSH流量:SSH(安全殼層)是一種加密的網(wǎng)絡(luò)協(xié)議,用于安全和遠(yuǎn)程登錄。SSH流量通常用于安全的遠(yuǎn)程管理和文件傳輸。

這些網(wǎng)絡(luò)流量類型在不同的應(yīng)用場(chǎng)景和協(xié)議中扮演著不同的角色。分析和監(jiān)控不同類型的網(wǎng)絡(luò)流量可以幫助管理員了解網(wǎng)絡(luò)使用情況、排查故障并優(yōu)化網(wǎng)絡(luò)性能。

Linux下監(jiān)控網(wǎng)絡(luò)流量的目的

Linux下監(jiān)控網(wǎng)絡(luò)流量的目的有多個(gè):

  • 網(wǎng)絡(luò)性能優(yōu)化:監(jiān)控網(wǎng)絡(luò)流量可以幫助管理員了解網(wǎng)絡(luò)的使用情況和瓶頸,以便進(jìn)行性能優(yōu)化和提高網(wǎng)絡(luò)效率。
  • 安全性增強(qiáng):通過(guò)監(jiān)控網(wǎng)絡(luò)流量,可以及時(shí)發(fā)現(xiàn)異常的網(wǎng)絡(luò)流量,如DDoS攻擊、惡意軟件傳播等,以便及時(shí)采取相應(yīng)的防御措施。
  • 資源管理:監(jiān)控網(wǎng)絡(luò)流量可以幫助管理員了解各個(gè)主機(jī)或設(shè)備的網(wǎng)絡(luò)使用情況,對(duì)網(wǎng)絡(luò)資源進(jìn)行分配和管理,以避免某個(gè)用戶或設(shè)備占用過(guò)多的帶寬和資源導(dǎo)致其他用戶或設(shè)備受到影響。
  • 計(jì)費(fèi)和成本控制:監(jiān)控網(wǎng)絡(luò)流量可以幫助提供網(wǎng)絡(luò)服務(wù)的機(jī)構(gòu)或企業(yè)對(duì)用戶的網(wǎng)絡(luò)使用情況進(jìn)行計(jì)費(fèi)和成本控制,確保網(wǎng)絡(luò)資源的合理利用和節(jié)約成本。
  • 故障排查和問(wèn)題定位:通過(guò)監(jiān)控網(wǎng)絡(luò)流量,可以及時(shí)發(fā)現(xiàn)網(wǎng)絡(luò)故障、問(wèn)題和異常,輔助管理員進(jìn)行故障排除和問(wèn)題定位,以減少網(wǎng)絡(luò)停機(jī)時(shí)間和降低維護(hù)成本。

總而言之,監(jiān)控網(wǎng)絡(luò)流量可以提高網(wǎng)絡(luò)性能、保障網(wǎng)絡(luò)安全、管理網(wǎng)絡(luò)資源、控制成本和故障排查,對(duì)于維護(hù)良好的網(wǎng)絡(luò)運(yùn)行非常重要。

有哪些專門的工具和技術(shù)分析網(wǎng)絡(luò)流量

要實(shí)現(xiàn)Linux上的網(wǎng)絡(luò)流量分析,可以使用一些專門的工具和技術(shù)。下面是一些常用的方法和原理:

  • 使用抓包工具:在Linux上,可以使用像tcpdump、Wireshark這樣的抓包工具來(lái)捕獲網(wǎng)絡(luò)數(shù)據(jù)包。這些工具可以監(jiān)聽網(wǎng)絡(luò)接口,并將捕獲到的數(shù)據(jù)包保存到文件中進(jìn)行分析。
  • 使用流量監(jiān)控工具:像ntop、iftop、bmon等工具可以實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)接口的流量情況,并提供統(tǒng)計(jì)信息和圖形化展示。
  • 分析捕獲的數(shù)據(jù)包:捕獲到的數(shù)據(jù)包可以使用Wireshark等工具進(jìn)行解析和分析。Wireshark可以顯示捕獲的數(shù)據(jù)包的詳細(xì)信息,如源IP地址、目的IP地址、協(xié)議類型、端口等,并提供過(guò)濾機(jī)制來(lái)篩選感興趣的數(shù)據(jù)。
  • 使用流量分析工具:除了抓包工具和流量監(jiān)控工具,還有一些專門用于網(wǎng)絡(luò)流量分析的工具,如tcpflow、Bro等。這些工具可以解析并分析網(wǎng)絡(luò)流量中的各種協(xié)議,提供更深入的網(wǎng)絡(luò)流量分析功能。

這些工具的實(shí)現(xiàn)原理都涉及到網(wǎng)絡(luò)協(xié)議、socket編程、數(shù)據(jù)包的捕獲和解析等知識(shí)。具體來(lái)說(shuō),抓包工具通過(guò)監(jiān)聽網(wǎng)絡(luò)接口,將接收到的數(shù)據(jù)包保存到文件中;流量監(jiān)控工具通過(guò)讀取接口的流量數(shù)據(jù)并進(jìn)行統(tǒng)計(jì)和展示;數(shù)據(jù)包分析工具和流量分析工具則依靠網(wǎng)絡(luò)協(xié)議和數(shù)據(jù)包的解析來(lái)提供更深入的分析功能。

總體來(lái)說(shuō),實(shí)現(xiàn)網(wǎng)絡(luò)流量分析需要一定的網(wǎng)絡(luò)知識(shí)和編程技巧,同時(shí)需要使用相關(guān)工具和技術(shù)進(jìn)行數(shù)據(jù)的捕獲、解析和分析。

在Linux文件系統(tǒng)的/proc目錄下分析網(wǎng)絡(luò)流量

在Linux文件系統(tǒng)的/proc目錄下,可以找到一些與網(wǎng)絡(luò)流量相關(guān)的信息。以下是一些常見的文件和目錄:

/proc/net/dev:這個(gè)文件提供了網(wǎng)絡(luò)設(shè)備的收發(fā)網(wǎng)絡(luò)流量統(tǒng)計(jì)信息,包括每個(gè)網(wǎng)絡(luò)接口的接收和發(fā)送數(shù)據(jù)包數(shù)量、錯(cuò)誤統(tǒng)計(jì)、丟棄的數(shù)據(jù)包數(shù)量等。

使用cat或者less命令:你可以使用cat或者less命令來(lái)查看/proc下的文件內(nèi)容,例如:cat /proc/net/dev可以查看網(wǎng)絡(luò)設(shè)備的收發(fā)網(wǎng)絡(luò)流量統(tǒng)計(jì)信息。

使用awk或者sed命令進(jìn)一步處理:你可以使用awk或者sed命令來(lái)處理和過(guò)濾數(shù)據(jù),例如:cat /proc/net/dev | awk '{print $1, $2}'可以只打印出網(wǎng)絡(luò)設(shè)備名稱和接收流量的統(tǒng)計(jì)值.

/proc/net/tcp:這個(gè)文件提供了當(dāng)前TCP連接的詳細(xì)信息,包括本地和遠(yuǎn)程IP地址、端口號(hào),連接狀態(tài),以及一些統(tǒng)計(jì)信息。
使用grep命令篩選:你可以使用grep命令來(lái)篩選你感興趣的信息,例如:grep "ESTABLISHED" /proc/net/tcp可以查看當(dāng)前所有TCP連接中狀態(tài)為ESTABLISHED的連接信息。

/proc/net/udp:類似于/proc/net/tcp文件,提供了當(dāng)前UDP連接的詳細(xì)信息。

/proc/net/raw:提供了當(dāng)前原始套接字(RAW socket)的相關(guān)信息,包括本地和遠(yuǎn)程IP地址、協(xié)議類型等。

/proc/net/snmp:提供了簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)相關(guān)的統(tǒng)計(jì)信息,包括接口、IP、TCP、UDP等各層的統(tǒng)計(jì)信息。

/proc/net/ip_conntrack:如果系統(tǒng)啟用了連接跟蹤(conntrack)功能,這個(gè)文件提供了關(guān)于當(dāng)前連接的跟蹤信息,包括連接狀態(tài)、源IP地址、目的IP地址、端口號(hào)等。

這些文件提供了一些基本的網(wǎng)絡(luò)流量統(tǒng)計(jì)和連接信息,可以通過(guò)讀取這些文件進(jìn)行分析和監(jiān)控。想要更加深入和詳細(xì)地分析網(wǎng)絡(luò)流量,則需要使用更專業(yè)的網(wǎng)絡(luò)流量分析工具。

Linux C/C++ 網(wǎng)絡(luò)流量分析

代碼中網(wǎng)絡(luò)流量分析是一個(gè)用于網(wǎng)絡(luò)統(tǒng)計(jì)的命令行工具,用于監(jiān)視系統(tǒng)網(wǎng)絡(luò)接口的流量、帶寬使用情況以及與網(wǎng)絡(luò)相關(guān)的統(tǒng)計(jì)數(shù)據(jù)。它可以提供網(wǎng)絡(luò)傳輸?shù)母鞣N統(tǒng)計(jì)信息,包括數(shù)據(jù)包的數(shù)量、字節(jié)數(shù)、錯(cuò)誤、丟包等。

/*
 * 接口統(tǒng)計(jì)信息
 */
typedef struct nic_stats {
	struct timeval tv;		/* tv_sec, tv_usec */
	uint64_t rbytes;		/* total read bytes */
	uint64_t wbytes;		/* total written bytes */
	uint64_t rpackets;		/* total read packets */
	uint64_t wpackets;		/* total written packets */
	uint64_t ierr;			/* total input errors */
	uint64_t oerr;			/* total output errors */
	uint64_t coll;			/* total collisions */
	uint64_t nocp;			/* total nocanput */
	uint64_t defer;			/* total defers */
	uint64_t sat;			/* saturation value */
} nicstats_t;
/*
 * print_header - 打印標(biāo)題行
 */
static void
print_header(void)
{
	if (g_style)
		(void) printf("%8s %5s %14s %14s\n",
		    "Time", "Int", "rKb/s", "wKb/s");
	else
		(void) printf(
		    "%8s %5s %7s %7s %7s %7s %7s %7s %7s %7s\n",
		    "Time", "Int", "rKb/s", "wKb/s", "rPk/s",
		    "wPk/s", "rAvs", "wAvs", "%Util", "Sat");
}
static int split_ifname(char *if_name, char *drv, uint32_t *instance)
{
...
	n = 0;
	for (p = if_name; *p; p++)
		n++;
	if (n <= 1)
		return (B_FALSE);
	m = n;
	for (p--; isdigit(*p); p--)
		n--;
	if (m == n || n == 0)
		return (B_FALSE);
	(void) strncpy(drv, if_name, n);
	drv[n] = '\0';
	*instance = (uint32_t)atol(++p);
...
}
...
static void update_ksp_by_type(kstat_t **kspp, uint32_t types, char *name)
{
...
	if (types & KS_LINK) 
	{
		*kspp = fetch_ksp("link", 0, name);
		return;
	}
	(void) split_ifname(name, drv, &instance);
	if (types & KS_DRV_MAC) 
	{
		*kspp = fetch_ksp(drv, instance, "mac");
		return;
	}
	if (types & KS_DIN) 
	{
		*kspp = fetch_ksp(drv, instance, name);
		return;
	}
	if (types & KS_DRV) {
		*kspp = fetch_ksp(drv, instance, NULL);
		return;
	}
	if (types & KS_NAME) {
		*kspp = fetch_ksp(name, -1, NULL);
		return;
	}
	...
}
static void update_stats(void)
{
...
	(void) gettimeofday(&now_tv, NULL);
	if (g_tcp) 
	{
		/* 更新TCP統(tǒng)計(jì)信息 */
		if (g_new_kstat_chain) 
		{
			g_tcp_ksp = kstat_lookup(g_kc, "tcp", -1, "tcp");
			if (! g_tcp_ksp)
				die(1, "kstat_lookup");
		}
		if (kstat_read(g_kc, g_tcp_ksp, NULL) < 0)
			die(1, "kstat_read");
		g_tcp_new->tv.tv_sec = now_tv.tv_sec;
		g_tcp_new->tv.tv_usec = now_tv.tv_usec;
		TCP_UPDATE(inDataInorderSegs, "inDataInorderSegs");
		TCP_UPDATE(outDataSegs, "outDataSegs");
		TCP_UPDATE(inDataInorderBytes, "inDataInorderBytes");
		TCP_UPDATE(inDataUnorderSegs, "inDataUnorderSegs");
		TCP_UPDATE(inDataUnorderBytes, "inDataUnorderBytes");
		TCP_UPDATE(outDataBytes, "outDataBytes");
		TCP_UPDATE(estabResets, "estabResets");
		TCP_UPDATE(outRsts, "outRsts");
		TCP_UPDATE(attemptFails, "attemptFails");
		TCP_UPDATE(retransBytes, "retransBytes");
		TCP_UPDATE(passiveOpens, "passiveOpens");
		TCP_UPDATE(activeOpens, "activeOpens");
		TCP_UPDATE(halfOpenDrop, "halfOpenDrop");
		TCP_UPDATE(listenDrop, "listenDrop");
		TCP_UPDATE(listenDropQ0, "listenDropQ0");
	}
	if (g_udp) 
	{
		/* 更新UDP統(tǒng)計(jì)信息 */
		if (g_new_kstat_chain) 
		{
			g_udp_ksp = kstat_lookup(g_kc, "udp", -1, "udp");
			if (! g_udp_ksp)
				die(1, "kstat_lookup");
		}
		if (kstat_read(g_kc, g_udp_ksp, NULL) < 0)
			die(1, "kstat_read");
		g_udp_new->tv.tv_sec = now_tv.tv_sec;
		g_udp_new->tv.tv_usec = now_tv.tv_usec;
		UDP_UPDATE(inDatagrams, "inDatagrams");
		UDP_UPDATE(outDatagrams, "outDatagrams");
		UDP_UPDATE(inErrors, "inErrors");
		UDP_UPDATE(outErrors, "outErrors");
	}
	if (g_style == STYLE_NONE && ! g_list)
		return;
	/* 更新接口統(tǒng)計(jì)信息 */
	for (nicp = g_nicdatap; nicp; nicp = nicp->next) 
	{
		if (! (nicp->flags & NIC_UP))
			/* 鏈接未打開 */
			continue;
		if (g_nonlocal && (nicp->flags & NIC_LOOPBACK))
			continue;
		if (! (nicp->flags & NIC_OK_UPDATED))
			if (kstat_read(g_kc, nicp->op_ksp, NULL) < 0)
				die(1, "kstat_read");
		/* 保存網(wǎng)絡(luò)值 */
		nicp->new.tv.tv_sec = now_tv.tv_sec;
		nicp->new.tv.tv_usec = now_tv.tv_usec;
		nicp->new.rbytes =
			fetch6432(nicp->op_ksp, "rbytes64", "rbytes", 0);
		nicp->new.wbytes =
			fetch6432(nicp->op_ksp, "obytes64", "obytes", 0);
		nicp->new.rpackets =
			fetch6432(nicp->op_ksp, "ipackets64", "ipackets", 0);
		nicp->new.wpackets =
			fetch6432(nicp->op_ksp, "opackets64", "opackets", 0);
		switch (g_style) 
		{
		case STYLE_EXTENDED_PARSEABLE:
		case STYLE_EXTENDED:
			nicp->new.ierr = fetch32(nicp->op_ksp, "ierrors", 0);
			nicp->new.oerr = fetch32(nicp->op_ksp, "oerrors", 0);
			/*FALLTHROUGH*/
		case STYLE_FULL:
		case STYLE_SUMMARY:
			nicp->new.coll = fetch32(nicp->op_ksp, "collisions",
				0);
			nicp->new.nocp = fetch_nocanput(nicp->op_ksp, 0);
			nicp->new.defer = fetch32(nicp->op_ksp, "defer_xmts",
				0);
			nicp->new.sat = nicp->new.defer + nicp->new.nocp +
				nicp->new.coll;
			nicp->new.sat += fetch32(nicp->op_ksp, "noxmtbuf", 0);
			break;
		}
		nicp->speed = fetch64(nicp->op_ksp, "ifspeed", 0);
		nicp->duplex = fetch32(nicp->op_ksp, "link_duplex", 0);
	}
...
}
static void load_snmp(FILE *snmp)
{
...
	/* 從/proc/net/snmp加載TCP和/或UDP統(tǒng)計(jì)信息 */
...
	while (remaining) 
	{
		p = fgets(buf, sizeof (buf), snmp);
		if (! p)
			break;
		if (g_tcp && strncmp("Tcp: RtoAlgorithm RtoMin RtoMax MaxConn "
				"ActiveOpens PassiveOpens AttemptFails "
				"EstabResets CurrEstab InSegs OutSegs "
				"RetransSegs InErrs OutRsts", p, 141) == 0) 
				{
			int n;
			n = fscanf(snmp, "Tcp: %lld %lld %lld %lld "
			    "%lld %lld %lld %lld %lld %lld "
			    "%lld %lld %lld %lld\n",
			    &ll[0], &ll[1], &ll[2], &ll[3],
			    &ll[4], &ll[5], &ll[6], &ll[7],
			    &ll[8], &ll[9], &ll[10], &ll[11],
			    &ll[12], &ll[13]);
			if (n == 14) 
			{
				g_tcp_new->inDataInorderSegs = ll[9];
				g_tcp_new->outDataSegs = ll[10];
				g_tcp_new->estabResets = ll[7];
				g_tcp_new->outRsts = ll[13];
				g_tcp_new->attemptFails = ll[6];
				/* Note: bytes */
				g_tcp_new->retransBytes = ll[11];
				g_tcp_new->passiveOpens = ll[5];
				g_tcp_new->activeOpens = ll[4];
			}
			remaining--;
		} 
		else if (g_udp && strncmp("Udp: InDatagrams NoPorts "
				"InErrors OutDatagrams RcvbufErrors "
				"SndbufErrors\n", p, 72) == 0) 
				{
			int n;
			n = fscanf(snmp, "Udp: %lld %lld %lld %lld "
			    "%lld %lld\n",
			    &ll[0], &ll[1], &ll[2], &ll[3],
			    &ll[4], &ll[5]);
			if (n == 6) 
			{
				g_udp_new->inDatagrams = ll[0];
				g_udp_new->outDatagrams = ll[3];
				g_udp_new->inErrors = ll[2]; /* + ll[4]? */
				g_udp_new->outErrors = ll[5];
			}
			remaining--;
		}
	}
}
...
static void update_timestr(time_t *tptr)
{
...
	if (tptr)
		t = *tptr;
	else
		t = time(NULL);
	tm = localtime(&t);
	(void) strftime(g_timestr, sizeof (g_timestr), "%H:%M:%S", tm);
}
static void sleep_for(hrtime_t period, hrtime_t start_n)
{
...
	do 
	{
		pause_tv.tv_sec = pause_n / NANOSEC;
		pause_tv.tv_nsec = pause_n % NANOSEC;
		status = nanosleep(&pause_tv, (struct timespec *)NULL);
		if (status < 0)
			if (errno == EINTR)
			 {
				now_n = gethrtime();
				pause_n = start_n + period - now_n;
				if (pause_n < 100)
					return;
			}
			 else 
			{
				...
			}
	} while (status != 0);
}
...

If you need the complete source code, please add the WeChat number (c17865354792)

運(yùn)行結(jié)果:

Time列:表示當(dāng)前采樣的響應(yīng)時(shí)間.

Int: 網(wǎng)卡名稱.

rKB/s : 每秒接收到千字節(jié)數(shù).

wKB/s : 每秒寫的千字節(jié)數(shù).

rPk/s : 每秒接收到的數(shù)據(jù)包數(shù)目.

wPk/s : 每秒寫的數(shù)據(jù)包數(shù)目.

rAvs : 接收到的數(shù)據(jù)包平均大小.

wAvs : 傳輸?shù)臄?shù)據(jù)包平均大小.

%Util : 網(wǎng)卡利用率(百分比).

Sat : 網(wǎng)卡每秒的錯(cuò)誤數(shù).網(wǎng)卡是否接近飽滿的一個(gè)指標(biāo).嘗試去診斷網(wǎng)絡(luò)問(wèn)題的時(shí)候,推薦使用-x選項(xiàng)去查看更多的統(tǒng)計(jì)信息.

這將顯示ens33接口的流量、帶寬使用情況以及其他統(tǒng)計(jì)數(shù)據(jù):

監(jiān)控所有網(wǎng)絡(luò)接口的統(tǒng)計(jì)信息,同時(shí)顯示TCP和UDP連接相關(guān)的統(tǒng)計(jì)信息:

總結(jié)

網(wǎng)絡(luò)流量分析需要一定的技術(shù)知識(shí)和經(jīng)驗(yàn),但通過(guò)學(xué)習(xí)和實(shí)踐,我們可以掌握這個(gè)技能,更好地管理和維護(hù)網(wǎng)絡(luò)環(huán)境。

以上就是Linux C/C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具的詳細(xì)內(nèi)容,更多關(guān)于C/C++網(wǎng)絡(luò)流量分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • QT計(jì)算時(shí)間差的方法詳解

    QT計(jì)算時(shí)間差的方法詳解

    這篇文章主要為大家詳細(xì)介紹了利用QT實(shí)現(xiàn)計(jì)算兩個(gè)時(shí)間的時(shí)間差的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇

    C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    C++基于Boost.Asio實(shí)現(xiàn)端口映射器的過(guò)程詳解

    Boost.Asio 是一個(gè)功能強(qiáng)大的 C++ 庫(kù),用于異步編程和網(wǎng)絡(luò)編程,它提供了跨平臺(tái)的異步 I/O 操作,在這篇文章中,我們將深入分析一個(gè)使用 Boost.Asio 實(shí)現(xiàn)的簡(jiǎn)單端口映射服務(wù)器,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2023-11-11
  • C++如何保存bmp圖片

    C++如何保存bmp圖片

    這篇文章主要介紹了C++如何保存bmp圖片問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言switch使用之詭異用法詳解

    C語(yǔ)言switch使用之詭異用法詳解

    今天小編就為大家分享一篇C語(yǔ)言switch使用之詭異用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明

    C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明

    這篇文章主要介紹了C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++利用LuaIntf調(diào)用Lua的方法示例

    C++利用LuaIntf調(diào)用Lua的方法示例

    這篇文章主要給大家介紹了關(guān)于C++利用LuaIntf調(diào)用Lua以及利用lua-intf來(lái)調(diào)用C++函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • 數(shù)據(jù)結(jié)構(gòu)用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的實(shí)例

    數(shù)據(jù)結(jié)構(gòu)用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的實(shí)例

    這篇文章主要介紹了C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu)用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法

    深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法

    智能指針的核心實(shí)現(xiàn)技術(shù)是引用計(jì)數(shù),每使用它一次,內(nèi)部引用計(jì)數(shù)加1,每析構(gòu)一次內(nèi)部的引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存,今天通過(guò)本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧
    2021-07-07
  • C語(yǔ)言面試C++字符串替換空格示例

    C語(yǔ)言面試C++字符串替換空格示例

    這篇文章主要介紹了C語(yǔ)言面試中C++字符串替換空格示例,文中給出了基本上可以拿下offer的代碼,有需要的朋友可以借鑒參考下,希望大家都能早日拿到心儀的offer
    2021-09-09

最新評(píng)論