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

IO多路復(fù)用練習(xí)

這篇具有很好參考價(jià)值的文章主要介紹了IO多路復(fù)用練習(xí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、通過select搭建TCP服務(wù)器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>

#define PORT 8808
#define IP "192.168.122.92"

int main(int argc, const char *argv[])
{
	//創(chuàng)建流式套接字
	int sfd = socket(AF_INET,SOCK_STREAM,0);
	if(sfd < 0)
	{
		perror("socket");
		fprintf(stderr,"socket failed __%d__\n",__LINE__);
		return -1;
	}
	printf("socket success...\n");

	//設(shè)置允許端口號(hào)復(fù)用
	int reuse = 1;
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)  
	{
		perror("setsockopt");
		return -1;
	}

	//填充地址信息結(jié)構(gòu)體,真是的地址信息結(jié)構(gòu)體根據(jù)地址族制定
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	//綁定服務(wù)器IP和端口號(hào)
	if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
	{
		perror("bind");
		fprintf(stderr,"bind failed __%d__\n",__LINE__);
		return -1;
	}
	printf("bind success...\n");

	//將套接字設(shè)置為被動(dòng)監(jiān)聽狀態(tài)
	if(listen(sfd,10) < 0)
	{
		perror("listen");
		return -1;
	}
	printf("listen success...\n");

	//從已完成連接的隊(duì)列中獲取一個(gè)客戶信息,生成一個(gè)新的文件描述符,該文件描述符才是與客戶端通信的文件描述符
	struct sockaddr_in cin[1021];
	socklen_t addrlen = sizeof(cin);
	int s_res = -1;
	fd_set readfds;
	fd_set tempfds;
	FD_ZERO(&readfds);
	FD_ZERO(&tempfds);
	FD_SET(0,&readfds);
	FD_SET(sfd,&readfds);
	ssize_t res = 0;
	char buf[128] = "";
	int newfd = -1;
	int maxfd = sfd;
	int j = 0;

	while(1)
	{
		tempfds = readfds;
		s_res = select(maxfd+1,&tempfds,NULL,NULL,NULL);
		if(s_res < 0)
		{
			perror("select");
			return -1;
		}
		else if(0 == s_res)
		{
			break;
		}
		for(int i=0;i<=maxfd;i++)
		{
			if(!FD_ISSET(i,&tempfds))
				continue;
			if(0 == i)
			{
				fgets(buf,sizeof(buf),stdin);
				buf[strlen(buf)-1] = 0;
				printf("%s\n",buf);
			}
			else if(sfd == i)
			{
				newfd = accept(sfd,(struct sockaddr *)&(cin[j]),&addrlen);
				cin[newfd] = cin[j];
				if(newfd < 0)
				{
					perror("accept");
					return -1;
				}
				printf("[%s : %d] accept success\n",inet_ntoa(cin[newfd].sin_addr),ntohs(cin[newfd].sin_port));
				FD_SET(newfd,&readfds);
				maxfd = maxfd > newfd ? maxfd : newfd;
			}
			else
			{
				bzero(buf,sizeof(buf));
				res = recv(i,buf,sizeof(buf),0);
				if(res < 0)
				{
					perror("recv");
					return -1;
				}
				else if(0 == res)
				{
					printf("[%s : %d] client offline\n",inet_ntoa(cin[i].sin_addr),ntohs(cin[i].sin_port));
					close(i);
					FD_CLR(i,&readfds);
					while(FD_ISSET(maxfd,&readfds) == 0 && maxfd-->=0);
					continue;
				}
				printf("[%s : %d] %s\n",inet_ntoa(cin[i].sin_addr),ntohs(cin[i].sin_port),buf);
				//發(fā)送數(shù)據(jù)
				if(send(i,buf,sizeof(buf),0) < 0)
				{
					perror("send");
					return -1;
				}
			}
		}
	}

	//關(guān)閉所有文件描述符
	close(sfd);
	return 0;
}

二、通過select搭建TCP客戶端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

#define PORT 8808
#define IP "192.168.122.92"

int main(int argc, const char *argv[])
{
	//創(chuàng)建流式套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd < 0)
	{
		perror("socket");
		fprintf(stderr,"socket failed __%d__\n",__LINE__);
		return -1;
	}
	printf("socket success...\n");

	//設(shè)置允許端口號(hào)復(fù)用
	int reuse = 1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)  
	{
		perror("setsockopt");
		return -1;
	}


	//填充地址信息結(jié)構(gòu)體,真是的地址信息結(jié)構(gòu)體根據(jù)地址族制定
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	//連接服務(wù)器
	if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
	{
		perror("connetc");
		return -1;
	}
	printf("connect success...\n");

	ssize_t res = 0;
	char buf[128] = "";
	int s_res = -1;
	fd_set readfds;
	fd_set tempfds;
	FD_ZERO(&readfds);
	FD_SET(0,&readfds);
	FD_SET(cfd,&readfds);

	while(1)
	{
		tempfds = readfds;
		s_res = select(cfd+1,&tempfds,NULL,NULL,NULL);
		if(s_res < 0)
		{
			perror("select");
			return -1;
		}
		else if(0 == s_res)
		{
			break;
		}
		if(FD_ISSET(0,&tempfds))
		{
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1] = 0;
			//發(fā)送數(shù)據(jù)
			if(send(cfd,buf,sizeof(buf),0) < 0)
			{
				perror("send");
				return -1;
			}
		}
		if(FD_ISSET(cfd,&tempfds))
		{

			//接受數(shù)據(jù)
			bzero(buf,sizeof(buf));
			res = recv(cfd,buf,sizeof(buf),0);
			if(res < 0)
			{
				perror("recv");
				return -1;
			}
			else if(0 == res)
			{
				printf("[%s : %d] server offline\n",IP,PORT);
				break;
			}
			printf("[%s : %d] %s\n",IP,PORT,buf);
		}
	}

	//關(guān)閉所有文件描述符
	close(cfd);
	return 0;
}

三、通過poll搭建客戶端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <poll.h>

#define PORT 8808
#define IP "192.168.122.92"

int main(int argc, const char *argv[])
{
	//創(chuàng)建流式套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd < 0)
	{
		perror("socket");
		fprintf(stderr,"socket failed __%d__\n",__LINE__);
		return -1;
	}
	printf("socket success...\n");

	//設(shè)置允許端口號(hào)復(fù)用
	int reuse = 1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)  
	{
		perror("setsockopt");
		return -1;
	}


	//填充地址信息結(jié)構(gòu)體,真是的地址信息結(jié)構(gòu)體根據(jù)地址族制定
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	//連接服務(wù)器
	if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
	{
		perror("connetc");
		return -1;
	}
	printf("connect success...\n");

	ssize_t res = 0;
	char buf[128] = "";
	int p_res = -1;
	struct pollfd fds[2];
	fds[0].fd = 0;
	fds[0].events = POLLIN;
	fds[1].fd = cfd;
	fds[1].events = POLLIN;


	while(1)
	{

		p_res = poll(fds,2,-1);
		if(p_res < 0)
		{
			perror("select");
			return -1;
		}
		else if(0 == p_res)
		{
			break;
		}
		if(fds[0].revents & POLLIN != 0)
		{
			bzero(buf,sizeof(buf));
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1] = 0;
			//發(fā)送數(shù)據(jù)
			if(send(cfd,buf,sizeof(buf),0) < 0)
			{
				perror("send");
				return -1;
			}
		}
		if(fds[1].revents & POLLIN)
		{

			//接受數(shù)據(jù)
			bzero(buf,sizeof(buf));
			res = recv(cfd,buf,sizeof(buf),0);
			if(res < 0)
			{
				perror("recv");
				return -1;
			}
			else if(0 == res)
			{
				printf("[%s : %d] server offline\n",IP,PORT);
				break;
			}
			printf("[%s : %d] %s\n",IP,PORT,buf);
		}
	}

	//關(guān)閉所有文件描述符
	close(cfd);
	return 0;
}

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-663082.html

到了這里,關(guān)于IO多路復(fù)用練習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【APUE】網(wǎng)絡(luò)socket編程溫度采集智能存儲(chǔ)與上報(bào)項(xiàng)目技術(shù)------多路復(fù)用

    【APUE】網(wǎng)絡(luò)socket編程溫度采集智能存儲(chǔ)與上報(bào)項(xiàng)目技術(shù)------多路復(fù)用

    作者簡(jiǎn)介: 一個(gè)平凡而樂于分享的小比特,中南民族大學(xué)通信工程專業(yè)研究生在讀,研究方向無(wú)線聯(lián)邦學(xué)習(xí) 擅長(zhǎng)領(lǐng)域:驅(qū)動(dòng)開發(fā),嵌入式軟件開發(fā),BSP開發(fā) 作者主頁(yè):一個(gè)平凡而樂于分享的小比特的個(gè)人主頁(yè) 文章收錄專欄:網(wǎng)絡(luò)socket編程之溫度采集智能存儲(chǔ)與上報(bào)項(xiàng)目,本

    2024年04月10日
    瀏覽(34)
  • 網(wǎng)絡(luò)編程代碼實(shí)例:IO復(fù)用版

    網(wǎng)絡(luò)編程代碼實(shí)例:IO復(fù)用版

    網(wǎng)絡(luò)編程代碼實(shí)例:IO復(fù)用版。 yezhening/Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (github.com) Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (gitee.com) 使用傳輸控制協(xié)議(TCP) 服務(wù)端多進(jìn)程,一個(gè)服務(wù)端可連接多個(gè)客戶端 用戶在客戶端終端輸入,可多次

    2024年02月02日
    瀏覽(21)
  • IO多路復(fù)用練習(xí)

    一、通過select搭建TCP服務(wù)器 二、通過select搭建TCP客戶端 三、通過poll搭建客戶端

    2024年02月12日
    瀏覽(27)
  • 【高并發(fā)服務(wù)器 02】——線程池與IO多路復(fù)用

    線程池的好處 :所有的池都是為了事先把資源準(zhǔn)備好,在后續(xù)用的時(shí)候可以更加方便的拿到這個(gè)資源—— 不用去申請(qǐng)、釋放資源 什么時(shí)候用線程池 ? IO事務(wù)并發(fā)較高 :人在杭州,但是數(shù)據(jù)庫(kù)在北京,想要查詢數(shù)據(jù)庫(kù),需要通過互聯(lián)網(wǎng)建立TCP三次握手,頻繁地創(chuàng)建和銷毀線

    2024年03月23日
    瀏覽(24)
  • 多線程|多進(jìn)程|高并發(fā)網(wǎng)絡(luò)編程

    多線程|多進(jìn)程|高并發(fā)網(wǎng)絡(luò)編程

    多進(jìn)程并發(fā)服務(wù)器是一種經(jīng)典的服務(wù)器架構(gòu),它通過創(chuàng)建多個(gè)子進(jìn)程來(lái)處理客戶端連接,從而實(shí)現(xiàn)并發(fā)處理多個(gè)客戶端請(qǐng)求的能力。 概念: 服務(wù)器啟動(dòng)時(shí),創(chuàng)建主進(jìn)程,并綁定監(jiān)聽端口。 當(dāng)有客戶端連接請(qǐng)求時(shí),主進(jìn)程接受連接,并創(chuàng)建一個(gè)子進(jìn)程來(lái)處理該客戶端連接。

    2024年02月07日
    瀏覽(21)
  • 網(wǎng)絡(luò)模型與 IO 多路復(fù)用

    網(wǎng)絡(luò)模型與 IO 多路復(fù)用

    ??socket也稱作“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈路的描述符。應(yīng)用程序通常通過“套接字”向?qū)Χ税l(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。 ??socket是連接運(yùn)行在網(wǎng)絡(luò)上的兩個(gè)程序之間的通信端點(diǎn)。通信的兩端都有socket,它是一個(gè)通道,數(shù)據(jù)在兩個(gè)socket之間進(jìn)行傳輸

    2024年02月01日
    瀏覽(28)
  • [Linux] 網(wǎng)絡(luò)編程 - 初見TCP套接字編程: 實(shí)現(xiàn)簡(jiǎn)單的單進(jìn)程、多進(jìn)程、多線程、線程池tcp服務(wù)器

    [Linux] 網(wǎng)絡(luò)編程 - 初見TCP套接字編程: 實(shí)現(xiàn)簡(jiǎn)單的單進(jìn)程、多進(jìn)程、多線程、線程池tcp服務(wù)器

    網(wǎng)絡(luò)的上一篇文章, 我們介紹了網(wǎng)絡(luò)變成的一些重要的概念, 以及 UDP套接字的編程演示. 還實(shí)現(xiàn)了一個(gè)簡(jiǎn)單更簡(jiǎn)陋的UDP公共聊天室. [Linux] 網(wǎng)絡(luò)編程 - 初見UDP套接字編程: 網(wǎng)絡(luò)編程部分相關(guān)概念、TCP、UDP協(xié)議基本特點(diǎn)、網(wǎng)絡(luò)字節(jié)序、socket接口使用、簡(jiǎn)單的UDP網(wǎng)絡(luò)及聊天室實(shí)現(xiàn)…

    2024年02月16日
    瀏覽(32)
  • Linux網(wǎng)絡(luò)編程:多進(jìn)程 多線程_并發(fā)服務(wù)器

    文章目錄: 一:wrap常用函數(shù)封裝 wrap.h? wrap.c server.c封裝實(shí)現(xiàn) client.c封裝實(shí)現(xiàn) 二:多進(jìn)程process并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 三:多線程thread并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 ???? ??read 函數(shù)的返回值 wrap.h? wrap

    2024年02月12日
    瀏覽(31)
  • 計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    歡迎關(guān)注博主 Mindtechnist 或加入【Linux C/C++/Python社區(qū)】一起學(xué)習(xí)和分享Linux、C、C++、Python、Matlab,機(jī)器人運(yùn)動(dòng)控制、多機(jī)器人協(xié)作,智能優(yōu)化算法,濾波估計(jì)、多傳感器信息融合,機(jī)器學(xué)習(xí),人工智能等相關(guān)領(lǐng)域的知識(shí)和技術(shù)。 專欄:《網(wǎng)絡(luò)編程》 當(dāng)涉及到構(gòu)建高性能的服務(wù)

    2024年02月08日
    瀏覽(35)
  • 【高并發(fā)網(wǎng)絡(luò)通信架構(gòu)】引入IO多路復(fù)用(select,poll,epoll)實(shí)現(xiàn)高并發(fā)tcp服務(wù)端

    【高并發(fā)網(wǎng)絡(luò)通信架構(gòu)】引入IO多路復(fù)用(select,poll,epoll)實(shí)現(xiàn)高并發(fā)tcp服務(wù)端

    目錄 一,往期文章 二,基本概念 IO多路復(fù)用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者對(duì)比 三,函數(shù)清單 1.select 方法 2.fd_set 結(jié)構(gòu)體 3.poll 方法 4.struct pollfd 結(jié)構(gòu)體 5.epoll_create 方法 6.epoll_ctl 方法 7.epoll_wait 方法 8.struct epoll_event 結(jié)構(gòu)體 四,代碼實(shí)現(xiàn) select 操作流程 s

    2024年02月12日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包