欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:21 ? 次閱讀

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

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

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

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

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

4.?等待客戶端連接

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

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

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

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

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

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

練習(xí):

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

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

驗證方式:(1) 同一臺電腦演示 (2)同桌之間演示

考慮的問題:

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

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

(3)?超時處理

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

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

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

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

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

??一般情況下,推薦最大每次傳輸?shù)淖止?jié)數(shù)不超過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

理解: 一個線程就是一個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.?實現(xiàn)一個服務(wù)器實現(xiàn)多個客戶端的連接,實現(xiàn)通信。

思路: 一個客戶端就是一個獨立的線程。

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

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

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

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

需要考慮到資源搶占! 使用信號量!

(搶答器)

設(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ù)傳遞測試");
	pthread_create(&thread_2,NULL,start_2,"線程2的參數(shù)傳遞測試");
	
	pthread_detach(thread_1); //設(shè)置線程的分離屬性
	pthread_detach(thread_2); //設(shè)置線程的分離屬性
	
	while(1)
	{
		
	}
	return 0;
}

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

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

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

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

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

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

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

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

IO 條件:

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

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

#include 

#include 

#include 

#include 
select:同時可以監(jiān)控多個文件描述符。
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 :寫事件發(fā)生

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

struct timeval *timeout:輪詢的時間。

填NULL表示無限阻塞。

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

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

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

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

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

void FD_ZERO(fd_set *set); //清除整個文件描述符集合
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)識符
int clientfd[2];                       //保存TCP客戶端的網(wǎng)絡(luò)套接字
struct sockaddr_in client_address[2];  //存放客戶端的信息
socklen_t address_len[2];              //存放客戶端結(jié)構(gòu)體信息的長度
/*服務(wù)器端口號定義*/
#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);        //端口號賦值
	 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)聽的端口數(shù)量*/
   if(listen(socketfd,10)!=0)
   	{
   		 printf("服務(wù)器端口監(jiān)聽失敗!\n");	
   	   return -1;	 
   	}
   
    int i;
    
    for(i=0;i<2;i++)
   	{
   		 address_len[i]=sizeof(struct sockaddr);  //計算結(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11351

    瀏覽量

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

    關(guān)注

    88

    文章

    3639

    瀏覽量

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

    關(guān)注

    0

    文章

    505

    瀏覽量

    19762
收藏 人收藏

    評論

    相關(guān)推薦

    服務(wù)器如何處理 HTTP 請求

    服務(wù)器處理HTTP請求的過程是一個有序且復(fù)雜的流程,通常涉及多個步驟。以下是服務(wù)器處理HTTP請求的具體步驟: 監(jiān)聽端口 :HTTP服務(wù)器在特定的端口(通常是80端口,除非另有指定)上
    的頭像 發(fā)表于 12-30 09:37 ?164次閱讀

    如何調(diào)試 HTTP 請求和響應(yīng)

    調(diào)試HTTP請求和響應(yīng)是Web開發(fā)網(wǎng)絡(luò)編程中的一個重要技能。以下是一些步驟和工具,可以幫助你調(diào)試HTTP請求和響應(yīng): 1. 使用瀏覽器開發(fā)
    的頭像 發(fā)表于 12-30 09:28 ?422次閱讀

    socket 多線程編程實現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可
    的頭像 發(fā)表于 11-12 14:16 ?478次閱讀

    Python編程:處理網(wǎng)絡(luò)請求的代理技術(shù)

    網(wǎng)絡(luò)編程中,代理技術(shù)扮演著至關(guān)重要的角色,尤其在處理網(wǎng)絡(luò)請求時。通過代理服務(wù)器,我們可以實現(xiàn)請求的轉(zhuǎn)發(fā)、緩存、負(fù)載均衡以及安全控制等功能。
    的頭像 發(fā)表于 11-12 07:23 ?231次閱讀

    Linux網(wǎng)絡(luò)協(xié)議棧的實現(xiàn)

    請求并與底層的網(wǎng)絡(luò)硬件進(jìn)行交互。本文將深入探討 Linux 網(wǎng)絡(luò)協(xié)議棧的架構(gòu)與實現(xiàn),涵蓋數(shù)據(jù)包處理流程、關(guān)鍵模塊、協(xié)議棧層次以及性能優(yōu)化等方
    的頭像 發(fā)表于 09-10 09:51 ?380次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡(luò)</b>協(xié)議棧的實現(xiàn)

    嵌入式linux開發(fā)的基本步驟有哪些?

    之前,首先需要選擇合適的硬件平臺。硬件選擇需要考慮以下幾個方面: 1.1 處理器 嵌入式Linux開發(fā)需要一個處理器,常見的處理器有ARM、
    的頭像 發(fā)表于 09-02 09:11 ?641次閱讀

    嵌入式linux開發(fā)板芯片的工作原理

    處理器、存儲器、輸入/輸出接口等硬件資源的嵌入式系統(tǒng)開發(fā)平臺。它通常采用Linux操作系統(tǒng)作為底層軟件平臺,提供了豐富的開發(fā)工具和庫函數(shù),
    的頭像 發(fā)表于 09-02 09:07 ?480次閱讀

    linux開發(fā)板與樹莓派的區(qū)別

    操作系統(tǒng)的微型計算機(jī),主要用于教育、編程、媒體播放等領(lǐng)域。 硬件配置 Linux開發(fā)板:Linux開發(fā)板的硬件配置因廠商和型號而異,通常包括處理
    的頭像 發(fā)表于 08-30 15:34 ?1156次閱讀

    linux開發(fā)板和單片機(jī)開發(fā)的區(qū)別

    硬件架構(gòu) Linux開發(fā)板和單片機(jī)開發(fā)在硬件架構(gòu)上有很大的區(qū)別。Linux開發(fā)板通常基于ARM、x86或其他
    的頭像 發(fā)表于 08-30 15:30 ?1307次閱讀

    鴻蒙OS開發(fā)實戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請求

    應(yīng)用通過HTTP發(fā)起一個數(shù)據(jù)請求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發(fā)表于 04-01 16:31 ?778次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>實戰(zhàn):【<b class='flag-5'>網(wǎng)絡(luò)</b>管理HTTP數(shù)據(jù)<b class='flag-5'>請求</b>】

    鴻蒙OS開發(fā)實例:【窺探網(wǎng)絡(luò)請求

    HarmonyOS 平臺中使用網(wǎng)絡(luò)請求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申請網(wǎng)絡(luò)權(quán)限, 即 “ohos.permission.INTERNET” 本篇文章將嘗試使用
    的頭像 發(fā)表于 04-01 16:11 ?849次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>實例:【窺探<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>請求</b>】

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請求

    request請求先返回。可以根據(jù)業(yè)務(wù)需要訂閱此消息。 4.調(diào)用該對象的request()方法,傳入http請求的url地址和可選參數(shù),發(fā)起網(wǎng)絡(luò)請求。 5.按照實際業(yè)務(wù)需要,解析返回結(jié)
    發(fā)表于 03-29 17:51

    鴻蒙開發(fā)實戰(zhàn):網(wǎng)絡(luò)請求庫【axios】

    [Axios]?,是一個基于 promise 的網(wǎng)絡(luò)請求庫,可以運(yùn)行 node.js 和瀏覽器中。本庫基于[Axios]原庫v1.3.4版本進(jìn)行適配,使其可以運(yùn)行在 OpenHarmony,并沿用其現(xiàn)有用法和特性。
    的頭像 發(fā)表于 03-25 16:47 ?4055次閱讀
    鴻蒙<b class='flag-5'>開發(fā)</b>實戰(zhàn):<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>請求</b>庫【axios】

    請問RTOS USBSetuPcb回調(diào)函數(shù)是在中斷還是單獨線程處理的?

    UART 通信)和異步 USB Setup 請求回調(diào)處理程序函數(shù)之間的 Uart 訪問之間存在競爭條件。 -> 在執(zhí)行主循環(huán)UART功能的同時,正在執(zhí)行USB消息處理UART功能。 要
    發(fā)表于 02-23 06:10

    linux線程編程實例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?533次閱讀
    <b class='flag-5'>linux</b>多<b class='flag-5'>線程</b>編程實例