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

Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器)

這篇具有很好參考價(jià)值的文章主要介紹了Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

寫在前面

Linux網(wǎng)絡(luò)編程我是看視頻學(xué)的,Linux網(wǎng)絡(luò)編程,看完這個(gè)視頻大概網(wǎng)絡(luò)編程的基礎(chǔ)差不多就掌握了。這個(gè)系列是我看這個(gè)Linux網(wǎng)絡(luò)編程視頻寫的筆記總結(jié)。


高并發(fā)服務(wù)器

問題:

根據(jù)上一個(gè)筆記,我們可以寫出一個(gè)簡(jiǎn)單的服務(wù)端和客戶端通信,但是我們發(fā)現(xiàn)一個(gè)問題——服務(wù)器只能連接一個(gè)客戶端。然而在實(shí)際生活中,我們發(fā)現(xiàn)一個(gè)服務(wù)器連接的客戶端遠(yuǎn)遠(yuǎn)不止一個(gè),所以我們就要做一個(gè)高并發(fā)服務(wù)器。

解決方法:

回看之前的代碼,之所以只能一對(duì)一通信,是因?yàn)榉?wù)器只有一次執(zhí)行accept的機(jī)會(huì),一旦建立連接成功,就會(huì)去進(jìn)行通信處理業(yè)務(wù),而其他想要建立連接的服務(wù)器就沒辦法建立連接。因此我們想到在Linux系統(tǒng)編程中學(xué)的進(jìn)程和線程,我們可以讓父進(jìn)程(主線程)去監(jiān)聽,一定有客戶端請(qǐng)求建立連接,我們就創(chuàng)建子進(jìn)程(其他線程)去和客戶端建立連接進(jìn)行通信,父進(jìn)程(主線程)繼續(xù)監(jiān)聽。


多進(jìn)程并發(fā)服務(wù)器

思路(步驟):

  1. 前期準(zhǔn)備工作:
    • 先用socket()生成一個(gè)套接字lfd用來監(jiān)聽
    • bind()對(duì)第一步生成的套接字綁定地址結(jié)構(gòu)(綁的是服務(wù)器的地址結(jié)構(gòu))
    • listen()函數(shù)設(shè)置lfd的監(jiān)聽上限,最大是128.
  2. 進(jìn)入循環(huán),accept與客戶端建立連接,得到用于通信的套接字的文件描述符cfd
  3. fork()創(chuàng)建子進(jìn)程
  4. 對(duì)于父進(jìn)程,由于父進(jìn)程只是監(jiān)聽,不需要與客戶端進(jìn)行通信,所以我們就關(guān)閉cfd,注冊(cè)信號(hào)捕捉函數(shù),用來回收子進(jìn)程,然后一直循環(huán)監(jiān)聽。
  5. 對(duì)于子進(jìn)程,由于子進(jìn)程只是進(jìn)行通信,不需要監(jiān)聽,所以我們就關(guān)閉lfd,然后就與客戶端進(jìn)行通信,處理業(yè)務(wù)。

源代碼:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>	
#include<signal.h>

#define PORT 6666

void sys_err(char* str)
{
	perror(str);
	exit(-1);
}

void wait_child(int signum)		//信號(hào)捕捉,回收子進(jìn)程
{
	while((waitpid(0,NULL,WNOHANG))>0);
//	if(waitpid(0,NULL,0)!=-1)
//		printf("disconnect a client successfully\n");
	return;
}

int main()
{
	struct sockaddr_in addr_s,addr_c;
	socklen_t addr_c_len=sizeof addr_c;
	int lfd,cfd,res,n;
	pid_t pid;
	struct sigaction act;
	char buf[BUFSIZ],client_IP[1024];
	
	lfd=socket(AF_INET,SOCK_STREAM,0);
	if(lfd<0)
		sys_err("socket error");
		
	addr_s.sin_family=AF_INET;
	addr_s.sin_port=htons(PORT);
	addr_s.sin_addr.s_addr=htonl(INADDR_ANY);
	res=bind(lfd,(struct sockaddr*)&addr_s,sizeof addr_s);
	if(res==-1)
		sys_err("bind error");
		
	res=listen(lfd,128);
	if(res==-1)
		sys_err("listen error");
		
	while(1)
	{
		cfd=accept(lfd,(struct socket*)&addr_c,&addr_c_len);
		
		pid=fork();			//創(chuàng)建子進(jìn)程
		
		if(pid==0)			//子進(jìn)程
		{
			close(lfd);		//打印客戶端的IP和端口號(hào),可以省略
			printf("connect successfully,client IP:%s,port:%d\n",inet_ntop(AF_INET,&addr_c.sin_addr.s_addr,&client_IP,sizeof client_IP),ntohs(addr_c.sin_port));
			break;
		}
		
		else if(pid>0)
		{
			close(cfd);
			act.sa_handler=wait_child;
			sigemptyset(&act.sa_mask);
			act.sa_flags=0;
			sigaction(SIGCHLD,&act,NULL);
			continue;
		}
	}
	
	if(pid==0)		//父進(jìn)程
	{
		while(1)
		{
			n=read(cfd,buf,sizeof buf);
			for(int i=0;i<n;i++)
				buf[i]=toupper(buf[i]);
			write(cfd,buf,n);
			write(STDOUT_FILENO,buf,n);
		}
	}
	
	close(cfd);
	close(lfd);
	
	return 0;
}

效果

Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器),# Linux網(wǎng)絡(luò)編程,Linux,服務(wù)器,linux,學(xué)習(xí),高并發(fā)服務(wù)器,多進(jìn)程高并發(fā)服務(wù)器,多線程高并發(fā)服務(wù)器


多線程并發(fā)服務(wù)器

思路(步驟):

  1. 前期準(zhǔn)備工作:
    • 先用socket()生成一個(gè)套接字lfd用來監(jiān)聽
    • bind()對(duì)第一步生成的套接字綁定地址結(jié)構(gòu)(綁的是服務(wù)器的地址結(jié)構(gòu))
    • listen()函數(shù)設(shè)置lfd的監(jiān)聽上限,最大是128.
  2. 進(jìn)入循環(huán),accept與客戶端建立連接,得到用于通信的套接字的文件描述符cfd
  3. 創(chuàng)建子線程
  4. 對(duì)于子線程,由于子線程只是進(jìn)行通信,不需要監(jiān)聽,所以我們就關(guān)閉lfd,然后就與客戶端進(jìn)行通信,處理業(yè)務(wù)。
  5. 對(duì)于父進(jìn)程,由于父線程只是監(jiān)聽,不需要與客戶端進(jìn)行通信,所以我們就關(guān)閉cfd,然后設(shè)置線程pthread_detach()分離或者使用pthread_join()回收子線程。

源代碼

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<pthread.h>

#define PORT 6666

void sys_err(char* str)
{
	perror(str);
	exit(-1);
}

void* fun(void* arg)
{
	int cfd=(int) arg,n;
	char buf[BUFSIZ];
	while(1)
	{
		n=read(cfd,buf,sizeof buf);
		if(n==0)
		{
			printf("one client closed......\n");
			break;
		}
		for(int i=0;i<n;i++)
			buf[i]=toupper(buf[i]);
		write(cfd,buf,n);
		write(STDOUT_FILENO,buf,n);
	}
	close(cfd);
	return NULL;
}
	
	

int main()
{
	struct sockaddr_in addr_s,addr_c;
	socklen_t addr_c_len=sizeof addr_c;
	char c_IP[1024];
	int lfd,cfd,res;
	pthread_t tid;

	addr_s.sin_family=AF_INET;
	addr_s.sin_port=htons(PORT);
	addr_s.sin_addr.s_addr=htonl(INADDR_ANY);

	lfd=socket(AF_INET,SOCK_STREAM,0);
	if(lfd<0)
		sys_err("socket errro");

	res=bind(lfd,(struct sockaddr*)&addr_s,sizeof addr_s);
	if(res<0)
		sys_err("bind error");

	res=listen(lfd,128);	
	if(res<0)
		sys_err("listen error");
	
	printf("accepting connect........\n");
	while(1)
	{
		cfd=accept(lfd,(struct sockaddr*)& addr_c,&addr_c_len);
		if(cfd==-1)
			sys_err("accept error");
		printf("connect successfully,client ip:%s,port:%d\n",inet_ntop(AF_INET,&addr_c.sin_addr.s_addr,c_IP,sizeof c_IP),ntohs(addr_c.sin_port));

		res=pthread_create(&tid,NULL,fun,(void*)cfd);
		if(res!=0)
			fprintf(stderr,"pthread create error:%s",strerror(res));

		pthread_detach(tid);	
		if(res!=0)
			fprintf(stderr,"pthread create error:%s",strerror(res));
	}
	close(lfd);
	return 0;
}

效果

Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器),# Linux網(wǎng)絡(luò)編程,Linux,服務(wù)器,linux,學(xué)習(xí),高并發(fā)服務(wù)器,多進(jìn)程高并發(fā)服務(wù)器,多線程高并發(fā)服務(wù)器


寫在最后

個(gè)人親身經(jīng)驗(yàn):我們學(xué)習(xí)的一系列Linux命令,一定要自己親手去敲。不要只是看別人敲代碼,不要只是停留在眼睛看,腦袋以為自己懂了,等你實(shí)際上手去敲會(huì)發(fā)現(xiàn)許許多多的這樣那樣的問題。畢竟“實(shí)踐出真知”。


如果你覺得我寫的題解還不錯(cuò)的,請(qǐng)各位王子公主移步到我的其他題解看看

  1. 數(shù)據(jù)結(jié)構(gòu)與算法部分(還在更新中):
  • C++ STL總結(jié) - 基于算法競(jìng)賽(強(qiáng)力推薦
  • 動(dòng)態(tài)規(guī)劃——01背包問題
  • 動(dòng)態(tài)規(guī)劃——完全背包問題
  • 動(dòng)態(tài)規(guī)劃——多重背包問題
  • 動(dòng)態(tài)規(guī)劃——分組背包問題
  • 動(dòng)態(tài)規(guī)劃——最長(zhǎng)上升子序列(LIS)
  • 二叉樹的中序遍歷(三種方法)
  • 最長(zhǎng)回文子串
  • 最短路算法——Dijkstra(C++實(shí)現(xiàn))
  • 最短路算法———Bellman_Ford算法(C++實(shí)現(xiàn))
  • 最短路算法———SPFA算法(C++實(shí)現(xiàn))
  • 最小生成樹算法———prim算法(C++實(shí)現(xiàn))
  • 最小生成樹算法———Kruskal算法(C++實(shí)現(xiàn))
  • 染色法判斷二分圖(C++實(shí)現(xiàn))
  1. Linux部分(還在更新中):
  • Linux學(xué)習(xí)之初識(shí)Linux
  • Linux學(xué)習(xí)之命令行基礎(chǔ)操作
  • Linux學(xué)習(xí)之基礎(chǔ)命令(適合小白)
  • Linux學(xué)習(xí)之權(quán)限管理和用戶管理
  • Linux學(xué)習(xí)之制作靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
  • Linux學(xué)習(xí)之makefile
  • Linux學(xué)習(xí)之系統(tǒng)編程1(關(guān)于讀寫系統(tǒng)函數(shù))
  • Linux學(xué)習(xí)之系統(tǒng)編程2(關(guān)于進(jìn)程及其相關(guān)的函數(shù))
  • Linux學(xué)習(xí)之系統(tǒng)編程3(進(jìn)程及wait函數(shù))
  • Linux學(xué)習(xí)之系統(tǒng)編程4(進(jìn)程間通信)
  • Linux學(xué)習(xí)之系統(tǒng)編程5(信號(hào))
  • Linux學(xué)習(xí)之系統(tǒng)編程6(線程)
  • Linux學(xué)習(xí)之系統(tǒng)編程7(線程同步/互斥鎖/信號(hào)量/條件變量)
  • Linux學(xué)習(xí)之網(wǎng)絡(luò)編程(純理論)
  • Linux學(xué)習(xí)之網(wǎng)絡(luò)編程2(socket,簡(jiǎn)單C/S模型)

???總結(jié)

“種一顆樹最好的是十年前,其次就是現(xiàn)在”
所以,
“讓我們一起努力吧,去奔赴更高更遠(yuǎn)的山海”
Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器),# Linux網(wǎng)絡(luò)編程,Linux,服務(wù)器,linux,學(xué)習(xí),高并發(fā)服務(wù)器,多進(jìn)程高并發(fā)服務(wù)器,多線程高并發(fā)服務(wù)器
如果有錯(cuò)誤?,歡迎指正喲??

??如果覺得收獲滿滿,可以動(dòng)動(dòng)小手,點(diǎn)點(diǎn)贊??,支持一下喲??文章來源地址http://www.zghlxwxcb.cn/news/detail-789518.html

到了這里,關(guān)于Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • Linux網(wǎng)絡(luò)編程:線程池并發(fā)服務(wù)器 _UDP客戶端和服務(wù)器_本地和網(wǎng)絡(luò)套接字

    Linux網(wǎng)絡(luò)編程:線程池并發(fā)服務(wù)器 _UDP客戶端和服務(wù)器_本地和網(wǎng)絡(luò)套接字

    文章目錄: 一:線程池模塊分析 threadpool.c 二:UDP通信 1.TCP通信和UDP通信各自的優(yōu)缺點(diǎn) 2.UDP實(shí)現(xiàn)的C/S模型 server.c client.c 三:套接字? 1.本地套接字 2.本地套 和 網(wǎng)絡(luò)套對(duì)比 server.c client.c threadpool.c ? server.c client.c server.c client.c

    2024年02月11日
    瀏覽(91)
  • 【網(wǎng)絡(luò)編程】高性能并發(fā)服務(wù)器源碼剖析

    【網(wǎng)絡(luò)編程】高性能并發(fā)服務(wù)器源碼剖析

    ? hello !大家好呀! 歡迎大家來到我的網(wǎng)絡(luò)編程系列之洪水網(wǎng)絡(luò)攻擊,在這篇文章中, 你將會(huì)學(xué)習(xí)到在網(wǎng)絡(luò)編程中如何搭建一個(gè)高性能的并發(fā)服務(wù)器,并且我會(huì)給出源碼進(jìn)行剖析,以及手繪UML圖來幫助大家來理解,希望能讓大家更能了解網(wǎng)絡(luò)編程技術(shù)!?。?希望這篇文章能

    2024年04月15日
    瀏覽(42)
  • 網(wǎng)絡(luò)編程(8.14)TCP并發(fā)服務(wù)器模型

    網(wǎng)絡(luò)編程(8.14)TCP并發(fā)服務(wù)器模型

    作業(yè): 1.?多線程中的newfd,能否修改成全局,不行,為什么? 2.?多線程中分支線程的newfd能否不另存,直接用指針間接訪問主線程中的newfd,不行,為什么? 多線程并發(fā)服務(wù)器模型原代碼: 1.將newfd改成全局變量效果: ?答:不行,因?yàn)閚ewfd是全局變量的話,客戶端連接后生成

    2024年02月13日
    瀏覽(28)
  • 計(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)
  • libevent高并發(fā)網(wǎng)絡(luò)編程 - 04_libevent實(shí)現(xiàn)http服務(wù)器

    libevent高并發(fā)網(wǎng)絡(luò)編程 - 04_libevent實(shí)現(xiàn)http服務(wù)器

    鏈接: C/C++Linux服務(wù)器開發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂 在libevent中,HTTP的實(shí)現(xiàn)主要是通過 evhttp 模塊來完成的。 evhttp 提供了一個(gè)高層次的HTTP服務(wù)器接口,可以處理HTTP請(qǐng)求并發(fā)送HTTP響應(yīng)。 在源碼中,libevent的HTTP協(xié)議處理主要是通過 evhttp 模塊來完成的。

    2024年02月15日
    瀏覽(29)
  • 多進(jìn)程并發(fā)TCP服務(wù)器模型(含客戶端)(網(wǎng)絡(luò)編程 C語言實(shí)現(xiàn))

    摘要 :大家都知道不同pc間的通信需要用到套接字sockte來實(shí)現(xiàn),但是服務(wù)器一次只能收到一個(gè)客戶端發(fā)來的消息,所以為了能讓服務(wù)器可以接收多個(gè)客戶端的連接與消息的傳遞,我們就引入了多進(jìn)程并發(fā)這樣一個(gè)概念。聽名字就可以知道--需要用到進(jìn)程,當(dāng)然也有多線程并發(fā)

    2024年02月17日
    瀏覽(104)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    作者:愛寫代碼的剛子 時(shí)間:2024.4.4 前言:本篇博客主要介紹TCP及其服務(wù)器編碼 只介紹基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員struct in_addr sin_addr表示32位 的IP地址 但是我們通常用點(diǎn)分十進(jìn)制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換 字符串轉(zhuǎn)in

    2024年04月14日
    瀏覽(107)
  • 計(jì)算機(jī)網(wǎng)絡(luò)套接字編程實(shí)驗(yàn)-TCP多進(jìn)程并發(fā)服務(wù)器程序與單進(jìn)程客戶端程序(簡(jiǎn)單回聲)

    1.實(shí)驗(yàn)系列 ·Linux NAP-Linux網(wǎng)絡(luò)應(yīng)用編程系列 2.實(shí)驗(yàn)?zāi)康?·理解多進(jìn)程(Multiprocess)相關(guān)基本概念,理解父子進(jìn)程之間的關(guān)系與差異,熟練掌握基于fork()的多進(jìn)程編程模式; ·理解僵尸進(jìn)程產(chǎn)生原理,能基于|sigaction()或signal(),使用waitpid()規(guī)避僵尸進(jìn)程產(chǎn)生; ·

    2024年02月12日
    瀏覽(36)
  • Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第五章 Linux網(wǎng)絡(luò)編程基礎(chǔ)API

    Linux高性能服務(wù)器編程 學(xué)習(xí)筆記 第五章 Linux網(wǎng)絡(luò)編程基礎(chǔ)API

    我們將從以下3方面討論Linux網(wǎng)絡(luò)API: 1.socket地址API。socket最開始的含義是一個(gè)IP地址和端口對(duì)(ip,port),它唯一表示了使用TCP通信的一端,本書稱其為socket地址。 2.socket基礎(chǔ)API。socket的主要API都定義在sys/socket.h頭文件中,包括創(chuàng)建socket、命名socket、監(jiān)聽socket、接受連接、發(fā)

    2024年02月07日
    瀏覽(41)
  • Linux網(wǎng)絡(luò)編程:Socket套接字編程(Server服務(wù)器 Client客戶端)

    Linux網(wǎng)絡(luò)編程:Socket套接字編程(Server服務(wù)器 Client客戶端)

    文章目錄: 一:定義和流程分析 1.定義 2.流程分析? 3.網(wǎng)絡(luò)字節(jié)序 二:相關(guān)函數(shù)? IP地址轉(zhuǎn)換函數(shù)inet_pton inet_ntop(本地字節(jié)序 網(wǎng)絡(luò)字節(jié)序) socket函數(shù)(創(chuàng)建一個(gè)套接字) bind函數(shù)(給socket綁定一個(gè)服務(wù)器地址結(jié)構(gòu)(IP+port)) listen函數(shù)(設(shè)置最大連接數(shù)或者說能同時(shí)進(jìn)行三次握手的最

    2024年02月12日
    瀏覽(35)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包