91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux開(kāi)發(fā)_采用線程處理網(wǎng)絡(luò)請(qǐng)求

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 介紹Linux下網(wǎng)絡(luò)編程、線程編程,select機(jī)制,利用子線程響應(yīng)TCP服務(wù)器的請(qǐng)求。

??TCP服務(wù)器創(chuàng)建流程:

1.?創(chuàng)建套接字

2.?綁定IP地址和端口號(hào)(創(chuàng)建服務(wù)器)

3.?設(shè)置監(jiān)聽(tīng)的數(shù)量(限制最大可以連接的客戶端數(shù)量)

4.?等待客戶端連接

5.?實(shí)現(xiàn)基本通信

??TCP客戶端創(chuàng)建流程

1.?創(chuàng)建套接字

2.?連接服務(wù)器

3.?實(shí)現(xiàn)基本通信

任務(wù)1:網(wǎng)絡(luò)編程

練習(xí):

1.?實(shí)現(xiàn)TCP服務(wù)器與TCP客戶端之間的基本通信,收發(fā)數(shù)據(jù) (按照上課的思路流程看函數(shù)文檔)

2.?實(shí)現(xiàn)TCP服務(wù)器與TCP客戶端之間的文件傳輸。(單個(gè)文件傳輸)

驗(yàn)證方式:(1) 同一臺(tái)電腦演示 (2)同桌之間演示

考慮的問(wèn)題:

(1)?網(wǎng)絡(luò)的傳輸環(huán)境,考慮應(yīng)答問(wèn)題

(2)?數(shù)據(jù)丟包之后如何處理? 可以重發(fā)

(3)?超時(shí)處理

(4)?服務(wù)器與客戶端之間連接斷開(kāi)處理。(客戶端和服務(wù)器兩邊都需要重新連接)

文件傳輸可以在廣告機(jī)中使用。

(擴(kuò)展要求): 顯示接收進(jìn)度百分比,顯示接收的文件名稱,推薦: 定義結(jié)構(gòu)體(使用數(shù)據(jù)結(jié)構(gòu))

3.?(擴(kuò)展)實(shí)現(xiàn)TCP服務(wù)器與TCP客戶端之間的目錄傳輸。

4.?(擴(kuò)展)實(shí)現(xiàn)網(wǎng)絡(luò)聊天室(模仿QQ發(fā)送消息的效果)

??一般情況下,推薦最大每次傳輸?shù)淖止?jié)數(shù)不超過(guò)1024字節(jié)。

任務(wù)2:線程編程

#include

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

Compile and link with -pthread.

-lpthread

理解: 一個(gè)線程就是一個(gè)while(1)。

[root@wbyq linux-share-dir]# gcc app.c

/tmp/cccOs4TK.o: In function `main':

app.c:(.text+0x69): undefined reference to `pthread_create'

app.c:(.text+0x8d): undefined reference to `pthread_create'

collect2: ld 返回 1

[root@wbyq linux-share-dir]# gcc app.c -lpthread

練習(xí):

1.?學(xué)習(xí)線程的基本使用

#include 
#include 
void *start_1(void *arg)
{
	while(1)
	{
		printf("123\n");
		sleep(1);
	}
}

void *start_2(void *arg)
{
	while(1)
	{
		printf("456\n");
		sleep(1);
	}
}

int main(int argc,char *argv[])
{
	pthread_t thread_1;
	pthread_t thread_2;
	pthread_create(&thread_1,NULL,start_1,NULL);
	pthread_create(&thread_2,NULL,start_2,NULL);
	while(1)
	{
		printf("789\n");
		sleep(1);
	}
	return 0;
}

2.?實(shí)現(xiàn)一個(gè)服務(wù)器實(shí)現(xiàn)多個(gè)客戶端的連接,實(shí)現(xiàn)通信。

思路: 一個(gè)客戶端就是一個(gè)獨(dú)立的線程。

3.?擴(kuò)展練習(xí): 實(shí)現(xiàn)服務(wù)器同時(shí)對(duì)多個(gè)客戶端進(jìn)行文件發(fā)送。

(1)?服務(wù)器連接上一個(gè)客戶端就創(chuàng)建一個(gè)線程。

(2)?線程的函數(shù)需要寫(xiě)幾個(gè)? 1個(gè)

1個(gè)函數(shù)需要考慮的問(wèn)題: 函數(shù)的可重入性能!

需要考慮到資源搶占! 使用信號(hào)量!

(搶答器)

設(shè)置線程分離屬性:

#include 
#include 
char str1[]="123456";
char str2[]="abcdef";
void *start_1(void *arg)
{
	 printf("arg1=%s\n",arg);
	 sleep(1);
}

void *start_2(void *arg)
{
	printf("arg2=%s\n",arg);
	sleep(2);
}
int main(int argc,char *argv[])
{
	pthread_t thread_1;
	pthread_t thread_2;
	pthread_create(&thread_1,NULL,start_1,"線程1的參數(shù)傳遞測(cè)試");
	pthread_create(&thread_2,NULL,start_2,"線程2的參數(shù)傳遞測(cè)試");
	
	pthread_detach(thread_1); //設(shè)置線程的分離屬性
	pthread_detach(thread_2); //設(shè)置線程的分離屬性
	
	while(1)
	{
		
	}
	return 0;
}

任務(wù)3: select阻塞輪詢機(jī)制

(1)?服務(wù)器什么時(shí)候收到數(shù)據(jù)? read

(2)?客戶端什么時(shí)候收到數(shù)據(jù)? Read

(3)?客戶端如何判斷已經(jīng)與服務(wù)器斷開(kāi)連接?

使用select機(jī)制 ,當(dāng)select函數(shù)返回值為1,read函數(shù)為0就表示斷開(kāi)

(4)?服務(wù)器如何檢測(cè)客戶端已經(jīng)斷開(kāi)連接?

采用心跳包的模式: 規(guī)定客戶端每5秒鐘發(fā)送一個(gè)特定的數(shù)據(jù)給服務(wù)器。

??IO 多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進(jìn)程指定的一個(gè)或者多個(gè) IO 條件準(zhǔn)備讀取,它就通知該進(jìn)程。

IO 條件:

(1)?網(wǎng)絡(luò)編程中的讀寫(xiě)

(2)?標(biāo)準(zhǔn)輸出輸入中的讀寫(xiě)

#include 

#include 

#include 

#include 
select:同時(shí)可以監(jiān)控多個(gè)文件描述符。
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

參數(shù):

int nfds :最大的文件描述符+1

fd_set *readfds :讀事件發(fā)生

fd_set *writefds :寫(xiě)事件發(fā)生

fd_set *exceptfds:出現(xiàn)問(wèn)題

struct timeval *timeout:輪詢的時(shí)間。

填NULL表示無(wú)限阻塞。

結(jié)構(gòu)體里的成員填0,表示不阻塞

結(jié)構(gòu)體里的成員填>0,正常的阻塞時(shí)間

返回值: 0表示沒(méi)有任何事件發(fā)生,負(fù)數(shù)表示失敗。>0表示發(fā)生對(duì)應(yīng)的事件。
void FD_CLR(int fd, fd_set *set); //清除指定文件描述符

int FD_ISSET(int fd, fd_set *set); //檢測(cè)指定的文件描述符是否發(fā)生了事件

void FD_SET(int fd, fd_set *set); //添加指定的文件描述符到fd描述符集合(多次調(diào)用)

void FD_ZERO(fd_set *set); //清除整個(gè)文件描述符集合
struct timeval {

long tv_sec; /* seconds */

long tv_usec; /* microseconds */

};

TCP服務(wù)器端處理:

#include 
#include           /* See NOTES */
#include 
#include    //使用大小端轉(zhuǎn)換函數(shù)
#include 
#include 
#include 
#include 
#include 
#include 
//函數(shù)聲明
void *start_routine_1(void *dev);
void *start_routine_2(void *dev);

typedef void *(*start_routine) (void *);
start_routine fun[]={start_routine_1,start_routine_2};
pthread_t thread_id[2];                //存放線程的標(biāo)識(shí)符
int clientfd[2];                       //保存TCP客戶端的網(wǎng)絡(luò)套接字
struct sockaddr_in client_address[2];  //存放客戶端的信息
socklen_t address_len[2];              //存放客戶端結(jié)構(gòu)體信息的長(zhǎng)度
/*服務(wù)器端口號(hào)定義*/
#define P_host 8080

/*TCP服務(wù)器代碼*/
int main(int argc,char *argv[])
{
	 int socketfd;
	 struct sockaddr_in server_address;     //存放服務(wù)器的IP地址信息
	 
   memset(&server_address,0,sizeof(struct sockaddr_in)); //初始化內(nèi)存空間
   memset(client_address,0,sizeof(struct sockaddr_in)*2); //初始化內(nèi)存空間
   
	 server_address.sin_family=PF_INET;            //IPV4協(xié)議
	 server_address.sin_port=htons(P_host);        //端口號(hào)賦值
	 server_address.sin_addr.s_addr=INADDR_ANY;    //本地IP地址
  /*1 .創(chuàng)建套接字*/
   socketfd=socket(PF_INET,SOCK_STREAM,0);
   if(socketfd<0)
   	{
   	    printf("服務(wù)器網(wǎng)絡(luò)套接字創(chuàng)建失敗!\n");	
   	    return -1;
   	}
      	 
   /*2. 綁定端口,創(chuàng)建服務(wù)器*/
   if(bind(socketfd,(const struct sockaddr *)&server_address,sizeof(struct sockaddr))!=0)
   	{
   	    printf("服務(wù)器綁定端口失敗!\n");	
   	    return -1; 	
   	}
   
   /*3. 設(shè)監(jiān)聽(tīng)的端口數(shù)量*/
   if(listen(socketfd,10)!=0)
   	{
   		 printf("服務(wù)器端口監(jiān)聽(tīng)失敗!\n");	
   	   return -1;	 
   	}
   
    int i;
    
    for(i=0;i<2;i++)
   	{
   		 address_len[i]=sizeof(struct sockaddr);  //計(jì)算結(jié)構(gòu)體大小 20 
   	  /*4. 等待客戶端連接*/
	    if((clientfd[i]=accept(socketfd,(struct sockaddr *)&client_address[i],&address_len[i]))<0)
	   	{
	   	   	printf("等待客戶端連接失敗!\n");	
	   	    break;	
	   	} 
	    
	    //創(chuàng)建線程
	   	if(pthread_create(&thread_id[i],NULL,fun[i],NULL)!=0)
			{
			   printf("線程_%d_創(chuàng)建失敗!\n",i);		
			} 	
   	}
   	
   	while(1)
   	{
   	    	
   	}
     	
   //阻塞方式等待線程的結(jié)束
	pthread_join(thread_id[0],NULL);
	pthread_join(thread_id[1],NULL);
	return 0;	
}
//線程1
void *start_routine_1(void *dev)
{
	 while(1)
	 {
	 	  printf("TCP客戶端1連接!\n");
	 	  sleep(2);
	 }
	 //終止線程
	 pthread_exit(NULL);
}
//線程2
void *start_routine_2(void *dev)
{
	while(1)
	{
	 	  printf("TCP客戶端2連接!\n");
	 	  sleep(2);
	}
	 //終止線程
	 pthread_exit(NULL);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219012
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97184
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    509

    瀏覽量

    20826
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RK3562 單板機(jī) Linux-RT 系統(tǒng)開(kāi)發(fā)指南:內(nèi)核配置、實(shí)時(shí)性優(yōu)化與案例詳解

    Qt5、OpenCV 等組件的應(yīng)用支持。文檔通過(guò)實(shí)操流程與案例演示,明確實(shí)時(shí)線程創(chuàng)建、調(diào)度優(yōu)化等關(guān)鍵技術(shù),幫助開(kāi)發(fā)者高效實(shí)現(xiàn)低延遲系統(tǒng)部署,適配工業(yè)控制、實(shí)時(shí)數(shù)據(jù)處理等場(chǎng)景。
    的頭像 發(fā)表于 02-10 11:49 ?1.7w次閱讀
    RK3562 單板機(jī) <b class='flag-5'>Linux</b>-RT 系統(tǒng)<b class='flag-5'>開(kāi)發(fā)</b>指南:內(nèi)核配置、實(shí)時(shí)性優(yōu)化與案例詳解

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開(kāi)發(fā)基礎(chǔ)

    ,本文介紹Linux內(nèi)核開(kāi)發(fā)基礎(chǔ) 處理內(nèi)核的核心輔助函數(shù) Linux內(nèi)核加鎖機(jī)制和共享資源 無(wú)論是獨(dú)占式還是非獨(dú)占式地訪問(wèn)一個(gè)資源,若該資源可以被多個(gè)競(jìng)爭(zhēng)者訪問(wèn),則稱其為共享資源。當(dāng)獨(dú)
    發(fā)表于 01-12 22:45

    解析Linux的進(jìn)程、線程和協(xié)程

    更有效地利用多核的計(jì)算資源。 線程并行的應(yīng)用場(chǎng)景包括: (1)多線程服務(wù)器:多個(gè)線程可以同時(shí)處理客戶端請(qǐng)求,提高服務(wù)器的性能和響應(yīng)速度。
    發(fā)表于 12-22 11:00

    Linux線程對(duì)比單線程的優(yōu)勢(shì)

    Linux系統(tǒng)中,線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。線程被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)行單位。一個(gè)進(jìn)程可以擁有多個(gè)線程,這些線程
    發(fā)表于 12-01 06:11

    RK3588核心板/開(kāi)發(fā)板RT-Linux系統(tǒng)實(shí)時(shí)性及硬件中斷延遲測(cè)試

    本文介紹瑞芯微RK3588芯片平臺(tái)RT-Linux系統(tǒng)實(shí)時(shí)性及硬件中斷延遲測(cè)試,基于觸覺(jué)智能RK3588核心板/開(kāi)發(fā)板演示。Linux-RT實(shí)時(shí)性測(cè)試測(cè)試環(huán)境說(shuō)明本次測(cè)試是使用Cyclictest
    的頭像 發(fā)表于 11-28 18:57 ?677次閱讀
    RK3588核心板/<b class='flag-5'>開(kāi)發(fā)</b>板RT-<b class='flag-5'>Linux</b>系統(tǒng)實(shí)時(shí)性及硬件中斷延遲測(cè)試

    【免費(fèi)送書(shū)】成為硬核Linux開(kāi)發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)開(kāi)發(fā),一直給人門(mén)檻較高的印象,主要因內(nèi)核機(jī)制抽象、需深度理解硬件原理、開(kāi)發(fā)調(diào)試難度大所致。2021年,一本講解驅(qū)動(dòng)開(kāi)發(fā)的專著問(wèn)世即獲市場(chǎng)青睞,暢銷近萬(wàn)冊(cè)——這便
    的頭像 發(fā)表于 11-18 08:06 ?1398次閱讀
    【免費(fèi)送書(shū)】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開(kāi)發(fā)</b>者:《<b class='flag-5'>Linux</b> 設(shè)備驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>(第 2 版)》

    創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開(kāi)發(fā)板—Linux-RT應(yīng)用開(kāi)發(fā)案例

    Linux-RT 性能;還提供 rt_gpio_ctrl(實(shí)時(shí)線程控制 LED 翻轉(zhuǎn))、rt_input(實(shí)時(shí)線程監(jiān)聽(tīng)按鍵觸發(fā) LED)兩個(gè)開(kāi)發(fā)案例,含測(cè)試、編譯步驟與關(guān)鍵代碼,為評(píng)
    的頭像 發(fā)表于 09-25 17:25 ?749次閱讀
    創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)<b class='flag-5'>開(kāi)發(fā)</b>板—<b class='flag-5'>Linux</b>-RT應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>案例

    網(wǎng)絡(luò)接收線程erxmb異常的原因?怎么解決?

    兩個(gè)不同的軟件接收組播數(shù)據(jù)久了后均出現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)無(wú)法接收,網(wǎng)絡(luò)發(fā)送是正常的。lpc54628芯片。郵箱有8個(gè)但erxmb線程已經(jīng)無(wú)法運(yùn)行了,這是什么原因?qū)е?/div>
    發(fā)表于 09-15 08:06

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    任務(wù),并行是多個(gè)處理器或多核處理器同時(shí)執(zhí)行不同的任務(wù)。 Linux系統(tǒng)中進(jìn)行多線程編程時(shí),會(huì)涉及到主線程和子
    發(fā)表于 09-01 21:31

    Linux 應(yīng)用開(kāi)發(fā)手冊(cè)

    T507linux應(yīng)用開(kāi)發(fā)手冊(cè)
    發(fā)表于 08-22 17:01 ?15次下載

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之12:PCIe請(qǐng)求模塊設(shè)計(jì)(上)

    TLP發(fā)送。由于請(qǐng)求時(shí)序不沖突,采用單條內(nèi)部總線處理多模塊請(qǐng)求。所有請(qǐng)求數(shù)據(jù)長(zhǎng)度固定為32位雙字。更多性能信息可參考B站用戶名:專注與守望
    的頭像 發(fā)表于 08-04 09:52 ?628次閱讀
    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之12:PCIe<b class='flag-5'>請(qǐng)求</b>模塊設(shè)計(jì)(上)

    5分鐘學(xué)會(huì)網(wǎng)絡(luò)服務(wù)搭建!飛凌i.MX9352開(kāi)發(fā)板 + Linux 6.1實(shí)戰(zhàn)示例

    本文就將以飛凌嵌入式OK-MX9352-C開(kāi)發(fā)板(搭載了在工業(yè)物聯(lián)網(wǎng)領(lǐng)域廣泛應(yīng)用的NXP i.MX9352處理器)為平臺(tái),介紹如何在Linux6.1.36開(kāi)發(fā)環(huán)境當(dāng)中如何搭建常用的
    的頭像 發(fā)表于 06-13 16:42 ?1315次閱讀
    5分鐘學(xué)會(huì)<b class='flag-5'>網(wǎng)絡(luò)</b>服務(wù)搭建!飛凌i.MX9352<b class='flag-5'>開(kāi)發(fā)</b>板 + <b class='flag-5'>Linux</b> 6.1實(shí)戰(zhàn)示例

    摩爾線程Linux驅(qū)動(dòng)v3.0.0發(fā)布

    近日,摩爾線程正式推出Linux驅(qū)動(dòng)程序v3.0.0,全面支持圖形顯卡MTT S80和高性能專業(yè)顯卡MTT X300。作為v2.7.0RC4之后的重大升級(jí)版本,本次更新實(shí)現(xiàn)了多項(xiàng)關(guān)鍵技術(shù)突破:在架構(gòu)
    的頭像 發(fā)表于 05-08 11:38 ?1383次閱讀
    摩爾<b class='flag-5'>線程</b><b class='flag-5'>Linux</b>驅(qū)動(dòng)v3.0.0發(fā)布

    Linux主要的性能有哪些?

    ? 什么是Linux? ? Linux是一套自由傳播的類Unix操作系統(tǒng),是一個(gè)基于posix和unix的多用戶、多任務(wù)、支持多線程和多cpu的操作系統(tǒng)。它的基本思想有兩點(diǎn),一切都是文件和每個(gè)軟件
    的頭像 發(fā)表于 04-30 18:09 ?654次閱讀
    <b class='flag-5'>Linux</b>主要的性能有哪些?

    Linux網(wǎng)絡(luò)設(shè)置與基礎(chǔ)服務(wù)

    Linux網(wǎng)絡(luò)設(shè)置與基礎(chǔ)服務(wù)
    的頭像 發(fā)表于 04-09 11:51 ?3405次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡(luò)</b>設(shè)置與基礎(chǔ)服務(wù)