国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于epoll的TCP服務(wù)器端(C++)

這篇具有很好參考價值的文章主要介紹了基于epoll的TCP服務(wù)器端(C++)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

網(wǎng)絡(luò)編程——C++實(shí)現(xiàn)socket通信(TCP)高并發(fā)之epoll模式_tcp通信c++ 多客戶端epoll_n大橘為重n的博客-CSDN博客

網(wǎng)絡(luò)編程——C++實(shí)現(xiàn)socket通信(TCP)高并發(fā)之select模式_n大橘為重n的博客-CSDN博客

server.cpp?

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <ctype.h>
#include <sys/epoll.h>	//epoll頭文件

#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888

int main()
{
	int i_listenfd, i_connfd;
	struct sockaddr_in st_sersock;
	char msg[MAXSIZE];
	int nrecvSize = 0;

	struct epoll_event ev, events[MAXSIZE];
	int epfd, nCounts;	//epfd:epoll實(shí)例句柄, nCounts:epoll_wait返回值

	if((i_listenfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)	//建立socket套接字
	{
		printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}

	memset(&st_sersock, 0, sizeof(st_sersock));
	st_sersock.sin_family = AF_INET;  //IPv4協(xié)議
	st_sersock.sin_addr.s_addr = htonl(INADDR_ANY);	//INADDR_ANY轉(zhuǎn)換過來就是0.0.0.0,泛指本機(jī)的意思,也就是表示本機(jī)的所有IP,因?yàn)橛行C(jī)子不止一塊網(wǎng)卡,多網(wǎng)卡的情況下,這個就表示所有網(wǎng)卡ip地址的意思。
	st_sersock.sin_port = htons(IP_PORT);

	if(bind(i_listenfd,(struct sockaddr*)&st_sersock, sizeof(st_sersock)) < 0) //將套接字綁定IP和端口用于監(jiān)聽
	{
		printf("bind Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}

	if(listen(i_listenfd, 20) < 0)	//設(shè)定可同時排隊的客戶端最大連接個數(shù)
	{
		printf("listen Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}

	if((epfd = epoll_create(MAXSIZE)) < 0)	//創(chuàng)建epoll實(shí)例
	{
		printf("epoll_create Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(-1);
	}
	
	ev.events = EPOLLIN;
	ev.data.fd = i_listenfd;
	if(epoll_ctl(epfd, EPOLL_CTL_ADD, i_listenfd, &ev) < 0)
	{
		printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(-1);
	}
	printf("======waiting for client's request======\n");
	//準(zhǔn)備接受客戶端連接
	while(1)
	{
		if((nCounts = epoll_wait(epfd, events, MAXSIZE, -1)) < 0)
		{
			printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);
			exit(-1);
		}
		else if(nCounts == 0)
		{
			printf("time out, No data!\n");
		}
		else
		{
			for(int i = 0; i < nCounts; i++)
			{
				int tmp_epoll_recv_fd = events[i].data.fd;
				if(tmp_epoll_recv_fd == i_listenfd)	//有客戶端連接請求
				{
					if((i_connfd = accept(i_listenfd, (struct sockaddr*)NULL, NULL)) < 0)	//阻塞等待客戶端連接
					{
						printf("accept Error: %s (errno: %d)\n", strerror(errno), errno);
					//	continue;
					}	
					else
					{
						printf("Client[%d], welcome!\n", i_connfd);
					}
	
					ev.events = EPOLLIN;
					ev.data.fd = i_connfd;
					if(epoll_ctl(epfd, EPOLL_CTL_ADD, i_connfd, &ev) < 0)
					{
						printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);
						exit(-1);
					}
				}
				else	//若是已連接的客戶端發(fā)來數(shù)據(jù)請求
				{
					//接受客戶端發(fā)來的消息并作處理(小寫轉(zhuǎn)大寫)后回寫給客戶端
					memset(msg, 0 ,sizeof(msg));
					if((nrecvSize = read(tmp_epoll_recv_fd, msg, MAXSIZE)) < 0)
					{
						printf("read Error: %s (errno: %d)\n", strerror(errno), errno);
						continue;
					}
					else if( nrecvSize == 0)	//read返回0代表對方已close斷開連接。
					{
						printf("client has disconnected!\n");
						epoll_ctl(epfd, EPOLL_CTL_DEL, tmp_epoll_recv_fd, NULL);
						close(tmp_epoll_recv_fd);  //
					
						continue;
					}
					else
					{
						printf("recvMsg:%s", msg);
						for(int i=0; msg[i] != '\0'; i++)
						{
							msg[i] = toupper(msg[i]);
						}
						if(write(tmp_epoll_recv_fd, msg, strlen(msg)+1) < 0)
						{
							printf("write Error: %s (errno: %d)\n", strerror(errno), errno);
						}

					}
				}
			}
		}
	}//while
	close(i_listenfd);
	close(epfd);
	return 0;
}

?client.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-653941.html

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>

#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888

int i_sockfd = -1;

void SigCatch(int sigNum)	//信號捕捉函數(shù)(捕獲Ctrl+C)
{
	if(i_sockfd != -1)
	{
		close(i_sockfd);
	}
	printf("Bye~! Will Exit...\n");
	exit(0);
}

int main()
{
	struct sockaddr_in st_clnsock;
	char msg[1024];
	int nrecvSize = 0;

	signal(SIGINT, SigCatch);	//注冊信號捕獲函數(shù)

	if((i_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)	//建立套接字
	{
		printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}

	memset(&st_clnsock, 0, sizeof(st_clnsock));
	st_clnsock.sin_family = AF_INET;  //IPv4協(xié)議
	//IP地址轉(zhuǎn)換(直接可以從物理字節(jié)序的點(diǎn)分十進(jìn)制 轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序)
	if(inet_pton(AF_INET, IP_ADDR, &st_clnsock.sin_addr) <= 0)
	{
		printf("inet_pton Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}
	st_clnsock.sin_port = htons(IP_PORT);	//端口轉(zhuǎn)換(物理字節(jié)序到網(wǎng)絡(luò)字節(jié)序)

	if(connect(i_sockfd, (struct sockaddr*)&st_clnsock, sizeof(st_clnsock)) < 0)	//主動向設(shè)置的IP和端口號的服務(wù)端發(fā)出連接
	{
		printf("connect Error: %s (errno: %d)\n", strerror(errno), errno);
		exit(0);
	}

	printf("======connect to server, sent data======\n");

	while(1)	//循環(huán)輸入,向服務(wù)端發(fā)送數(shù)據(jù)并接受服務(wù)端返回的數(shù)據(jù)
	{
		fgets(msg, MAXSIZE, stdin);
		printf("will send: %s", msg);
		if(write(i_sockfd, msg, MAXSIZE) < 0)	//發(fā)送數(shù)據(jù)
		{
			printf("write Error: %s (errno: %d)\n", strerror(errno), errno);
			exit(0);
		}

		memset(msg, 0, sizeof(msg));
		if((nrecvSize = read(i_sockfd, msg, MAXSIZE)) < 0)	//接受數(shù)據(jù)
		{
			printf("read Error: %s (errno: %d)\n", strerror(errno), errno);
		}
		else if(nrecvSize == 0)
		{
			printf("Service Close!\n");
		}
		else
		{
			printf("Server return: %s\n", msg);
		}

	}
	return 0;
}

到了這里,關(guān)于基于epoll的TCP服務(wù)器端(C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • TCP服務(wù)器的演變過程:使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型實(shí)現(xiàn)百萬級并發(fā)(詳細(xì)代碼)

    TCP服務(wù)器的演變過程:使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型實(shí)現(xiàn)百萬級并發(fā)(詳細(xì)代碼)

    手把手教你從0開始編寫TCP服務(wù)器程序,體驗(yàn)開局一塊磚,大廈全靠壘。 為了避免篇幅過長使讀者感到乏味,對【TCP服務(wù)器的開發(fā)】進(jìn)行分階段實(shí)現(xiàn),一步步進(jìn)行優(yōu)化升級。 本節(jié),在上一章節(jié)介紹了如何使用epoll開發(fā)高效的服務(wù)器,本節(jié)將介紹使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型,實(shí)

    2024年02月01日
    瀏覽(30)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    目錄 1--Hello Word服務(wù)器端 2--客戶端 3--編譯運(yùn)行 3-1--編譯服務(wù)器端 3-2--編譯客戶端 3-3--運(yùn)行 運(yùn)行結(jié)果:

    2024年02月10日
    瀏覽(62)
  • 【TCP服務(wù)器的演變過程】使用IO多路復(fù)用器epoll實(shí)現(xiàn)TCP服務(wù)器

    【TCP服務(wù)器的演變過程】使用IO多路復(fù)用器epoll實(shí)現(xiàn)TCP服務(wù)器

    手把手教你從0開始編寫TCP服務(wù)器程序,體驗(yàn)開局一塊磚,大廈全靠壘。 為了避免篇幅過長使讀者感到乏味,對【TCP服務(wù)器的開發(fā)】進(jìn)行分階段實(shí)現(xiàn),一步步進(jìn)行優(yōu)化升級。 本節(jié),在上一章節(jié)的基礎(chǔ)上,將IO多路復(fù)用機(jī)制select改為更高效的IO多路復(fù)用機(jī)制epoll,使用epoll管理每

    2024年01月17日
    瀏覽(16)
  • TCP高并發(fā)服務(wù)器簡介(select、poll、epoll實(shí)現(xiàn)與區(qū)別)

    TCP高并發(fā)服務(wù)器簡介(select、poll、epoll實(shí)現(xiàn)與區(qū)別)

    一、創(chuàng)建套接字(socket函數(shù)): 二、填充服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體: 三、套接字和服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體進(jìn)行綁定(bind函數(shù)): 四、套接字設(shè)置成被動監(jiān)聽(listen函數(shù)): 五、創(chuàng)建要監(jiān)聽的文件描述符集合: 使用select函數(shù)后,會將 沒有就緒的文件描述符 在集合中 去除

    2024年01月19日
    瀏覽(24)
  • Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    一.前言 回顧之前進(jìn)程間通信(無名管道,有名管道,消息隊列,共享內(nèi)存,信號,信號量),都是在同一主機(jī)由內(nèi)核來完成的通信。 那不同主機(jī)間該怎么通信呢? 可以使用Socket編程來實(shí)現(xiàn)。 Socket編程可以通過網(wǎng)絡(luò)來實(shí)現(xiàn)實(shí)現(xiàn)不同主機(jī)之間的通訊。 二.Socket編程的網(wǎng)絡(luò)模型如

    2024年02月08日
    瀏覽(36)
  • C/S架構(gòu)學(xué)習(xí)之使用epoll實(shí)現(xiàn)TCP特大型并發(fā)服務(wù)器

    epoll實(shí)現(xiàn)TCP特大型并發(fā)服務(wù)器的流程: 一、創(chuàng)建套接字(socket函數(shù)): 通信域 選擇 IPV4 網(wǎng)絡(luò)協(xié)議、套接字類型選擇 流式 ; 二、填充服務(wù)器和客戶機(jī)的網(wǎng)絡(luò)信息結(jié)構(gòu)體: 1.分別定義服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體變量 serveraddr 和客戶機(jī)網(wǎng)絡(luò)信息結(jié)構(gòu)體變量 clientaddr ; 2.分別求出服務(wù)

    2024年02月08日
    瀏覽(26)
  • 手撕測試tcp服務(wù)器效率工具——以epoll和io_uring對比為例

    手撕測試tcp服務(wù)器效率工具——以epoll和io_uring對比為例

    服務(wù)器的性能測試主要包括2部分: 并發(fā)量。能容納多大的連接 效率。在不崩壞的情況下能對報文的處理效率。 本文主要進(jìn)行效率測試,看看基于epoll模型和io_uring模型的tcp服務(wù)器,誰的效率更高。 測試思路 客戶端(一個或多個)大量地向服務(wù)器發(fā)送報文,測試服務(wù)器的處理

    2024年01月18日
    瀏覽(23)
  • Linux網(wǎng)絡(luò)編程之TCP/IP實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)服務(wù)器設(shè)計指南

    目錄 引言: 多進(jìn)程服務(wù)器 例程分享: 多線程服務(wù)器 ?例程分享: I/O多路復(fù)用服務(wù)器 select 例程分享: poll 例程分享: epoll 例程分享: 總結(jié)建議 ????????隨著互聯(lián)網(wǎng)的迅猛發(fā)展,服務(wù)器面臨著越來越多的并發(fā)請求。如何設(shè)計一個能夠高效處理大量并發(fā)請求的服務(wù)器成為

    2024年02月20日
    瀏覽(33)
  • 【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    TCP服務(wù)器與客戶端的搭建需要借助以下API ServerSocket 是創(chuàng)建TCP服務(wù)端Socket的API。 ServerSocket 構(gòu)造方法 : 方法簽名 方法說明 ServerSocket(int port) 創(chuàng)建一個服務(wù)端流套接字Socket,并綁定到指定端口 ServerSocket 方法: 方法簽名 方法說明 Socket accept() 開始監(jiān)聽指定端口(創(chuàng)建時綁定的端

    2024年03月12日
    瀏覽(33)
  • 【網(wǎng)絡(luò)編程】——基于TCP協(xié)議實(shí)現(xiàn)回顯服務(wù)器及客戶端

    【網(wǎng)絡(luò)編程】——基于TCP協(xié)議實(shí)現(xiàn)回顯服務(wù)器及客戶端

    個人主頁:兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【網(wǎng)絡(luò)編程】【Java系列】 本專欄旨在分享學(xué)習(xí)網(wǎng)絡(luò)編程的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評論區(qū)交流討論?? TCP提供的API主要有兩個類 Socket ( 既會給服務(wù)器使用也會給客

    2024年02月03日
    瀏覽(44)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包