国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux開發_采用線程處理網絡請求

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

掃碼添加小助手

加入工程師交流群

【摘要】 介紹Linux下網絡編程、線程編程,select機制,利用子線程響應TCP服務器的請求。

??TCP服務器創建流程:

1.?創建套接字

2.?綁定IP地址和端口號(創建服務器)

3.?設置監聽的數量(限制最大可以連接的客戶端數量)

4.?等待客戶端連接

5.?實現基本通信

??TCP客戶端創建流程

1.?創建套接字

2.?連接服務器

3.?實現基本通信

任務1:網絡編程

練習:

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

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

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

考慮的問題:

(1)?網絡的傳輸環境,考慮應答問題

(2)?數據丟包之后如何處理? 可以重發

(3)?超時處理

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

文件傳輸可以在廣告機中使用。

(擴展要求): 顯示接收進度百分比,顯示接收的文件名稱,推薦: 定義結構體(使用數據結構)

3.?(擴展)實現TCP服務器與TCP客戶端之間的目錄傳輸。

4.?(擴展)實現網絡聊天室(模仿QQ發送消息的效果)

??一般情況下,推薦最大每次傳輸的字節數不超過1024字節。

任務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

練習:

1.?學習線程的基本使用

#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.?實現一個服務器實現多個客戶端的連接,實現通信。

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

3.?擴展練習: 實現服務器同時對多個客戶端進行文件發送。

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

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

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

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

(搶答器)

設置線程分離屬性:

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

任務3: select阻塞輪詢機制

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

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

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

使用select機制 ,當select函數返回值為1,read函數為0就表示斷開

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

采用心跳包的模式: 規定客戶端每5秒鐘發送一個特定的數據給服務器。

??IO 多路復用是指內核一旦發現進程指定的一個或者多個 IO 條件準備讀取,它就通知該進程。

IO 條件:

(1)?網絡編程中的讀寫

(2)?標準輸出輸入中的讀寫

#include 

#include 

#include 

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

參數:

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

fd_set *readfds :讀事件發生

fd_set *writefds :寫事件發生

fd_set *exceptfds:出現問題

struct timeval *timeout:輪詢的時間。

填NULL表示無限阻塞。

結構體里的成員填0,表示不阻塞

結構體里的成員填>0,正常的阻塞時間

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

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

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

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

long tv_sec; /* seconds */

long tv_usec; /* microseconds */

};

TCP服務器端處理:

#include 
#include           /* See NOTES */
#include 
#include    //使用大小端轉換函數
#include 
#include 
#include 
#include 
#include 
#include 
//函數聲明
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];                //存放線程的標識符
int clientfd[2];                       //保存TCP客戶端的網絡套接字
struct sockaddr_in client_address[2];  //存放客戶端的信息
socklen_t address_len[2];              //存放客戶端結構體信息的長度
/*服務器端口號定義*/
#define P_host 8080

/*TCP服務器代碼*/
int main(int argc,char *argv[])
{
	 int socketfd;
	 struct sockaddr_in server_address;     //存放服務器的IP地址信息
	 
   memset(&server_address,0,sizeof(struct sockaddr_in)); //初始化內存空間
   memset(client_address,0,sizeof(struct sockaddr_in)*2); //初始化內存空間
   
	 server_address.sin_family=PF_INET;            //IPV4協議
	 server_address.sin_port=htons(P_host);        //端口號賦值
	 server_address.sin_addr.s_addr=INADDR_ANY;    //本地IP地址
  /*1 .創建套接字*/
   socketfd=socket(PF_INET,SOCK_STREAM,0);
   if(socketfd<0)
   	{
   	    printf("服務器網絡套接字創建失敗!\n");	
   	    return -1;
   	}
      	 
   /*2. 綁定端口,創建服務器*/
   if(bind(socketfd,(const struct sockaddr *)&server_address,sizeof(struct sockaddr))!=0)
   	{
   	    printf("服務器綁定端口失敗!\n");	
   	    return -1; 	
   	}
   
   /*3. 設監聽的端口數量*/
   if(listen(socketfd,10)!=0)
   	{
   		 printf("服務器端口監聽失敗!\n");	
   	   return -1;	 
   	}
   
    int i;
    
    for(i=0;i<2;i++)
   	{
   		 address_len[i]=sizeof(struct sockaddr);  //計算結構體大小 20 
   	  /*4. 等待客戶端連接*/
	    if((clientfd[i]=accept(socketfd,(struct sockaddr *)&client_address[i],&address_len[i]))<0)
	   	{
	   	   	printf("等待客戶端連接失敗!\n");	
	   	    break;	
	   	} 
	    
	    //創建線程
	   	if(pthread_create(&thread_id[i],NULL,fun[i],NULL)!=0)
			{
			   printf("線程_%d_創建失敗!\n",i);		
			} 	
   	}
   	
   	while(1)
   	{
   	    	
   	}
     	
   //阻塞方式等待線程的結束
	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);
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97182
  • 線程
    +關注

    關注

    0

    文章

    509

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3562 單板機 Linux-RT 系統開發指南:內核配置、實時性優化與案例詳解

    Qt5、OpenCV 等組件的應用支持。文檔通過實操流程與案例演示,明確實時線程創建、調度優化等關鍵技術,幫助開發者高效實現低延遲系統部署,適配工業控制、實時數據處理等場景。
    的頭像 發表于 02-10 11:49 ?1.7w次閱讀
    RK3562 單板機 <b class='flag-5'>Linux</b>-RT 系統<b class='flag-5'>開發</b>指南:內核配置、實時性優化與案例詳解

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核開發基礎

    ,本文介紹Linux內核開發基礎 處理內核的核心輔助函數 Linux內核加鎖機制和共享資源 無論是獨占式還是非獨占式地訪問一個資源,若該資源可以被多個競爭者訪問,則稱其為共享資源。當獨
    發表于 01-12 22:45

    解析Linux的進程、線程和協程

    更有效地利用多核的計算資源。 線程并行的應用場景包括: (1)多線程服務器:多個線程可以同時處理客戶端請求,提高服務器的性能和響應速度。
    發表于 12-22 11:00

    Linux線程對比單線程的優勢

    Linux系統中,線程是操作系統能夠進行運算調度的最小單位。線程被包含在進程之中,是進程中的實際運行單位。一個進程可以擁有多個線程,這些線程
    發表于 12-01 06:11

    RK3588核心板/開發板RT-Linux系統實時性及硬件中斷延遲測試

    本文介紹瑞芯微RK3588芯片平臺RT-Linux系統實時性及硬件中斷延遲測試,基于觸覺智能RK3588核心板/開發板演示。Linux-RT實時性測試測試環境說明本次測試是使用Cyclictest
    的頭像 發表于 11-28 18:57 ?675次閱讀
    RK3588核心板/<b class='flag-5'>開發</b>板RT-<b class='flag-5'>Linux</b>系統實時性及硬件中斷延遲測試

    【免費送書】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致。2021年,一本講解驅動開發的專著問世即獲市場青睞,暢銷近萬冊——這便
    的頭像 發表于 11-18 08:06 ?1394次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開發</b>者:《<b class='flag-5'>Linux</b> 設備驅動<b class='flag-5'>開發</b>(第 2 版)》

    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業開發板—Linux-RT應用開發案例

    Linux-RT 性能;還提供 rt_gpio_ctrl(實時線程控制 LED 翻轉)、rt_input(實時線程監聽按鍵觸發 LED)兩個開發案例,含測試、編譯步驟與關鍵代碼,為評
    的頭像 發表于 09-25 17:25 ?743次閱讀
    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業<b class='flag-5'>開發</b>板—<b class='flag-5'>Linux</b>-RT應用<b class='flag-5'>開發</b>案例

    網絡接收線程erxmb異常的原因?怎么解決?

    兩個不同的軟件接收組播數據久了后均出現網絡數據無法接收,網絡發送是正常的。lpc54628芯片。郵箱有8個但erxmb線程已經無法運行了,這是什么原因導致
    發表于 09-15 08:06

    【HZ-T536開發板免費體驗】—— linux創建線程

    任務,并行是多個處理器或多核處理器同時執行不同的任務。 Linux系統中進行多線程編程時,會涉及到主線程和子
    發表于 09-01 21:31

    Linux 應用開發手冊

    T507linux應用開發手冊
    發表于 08-22 17:01 ?15次下載

    NVMe高速傳輸之擺脫XDMA設計之12:PCIe請求模塊設計(上)

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

    5分鐘學會網絡服務搭建!飛凌i.MX9352開發板 + Linux 6.1實戰示例

    本文就將以飛凌嵌入式OK-MX9352-C開發板(搭載了在工業物聯網領域廣泛應用的NXP i.MX9352處理器)為平臺,介紹如何在Linux6.1.36開發環境當中如何搭建常用的
    的頭像 發表于 06-13 16:42 ?1315次閱讀
    5分鐘學會<b class='flag-5'>網絡</b>服務搭建!飛凌i.MX9352<b class='flag-5'>開發</b>板 + <b class='flag-5'>Linux</b> 6.1實戰示例

    摩爾線程Linux驅動v3.0.0發布

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

    Linux主要的性能有哪些?

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

    Linux網絡設置與基礎服務

    Linux網絡設置與基礎服務
    的頭像 發表于 04-09 11:51 ?3404次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>網絡</b>設置與基礎服務