基於Linux多執行緒的併發TCP服務

2021-10-06 15:27:44 字數 4026 閱讀 6130

經過兩天的學習,終於做出來可以向指定客戶端傳送資料的tcp服務,寫本次博文的目的有二,一是將學習成果分享給正在學習tcp併發服務的同行,二是整理一下筆記,方便日後複習。首先說一下為什麼學習tcp併發服務,6個月前去面試嵌入式軟體工程師的面試題是「用兩個半小時的時間用任意語言編寫乙個可以兩個及兩個以上客戶端定向通訊的tcp服務」,經過三個小時的時間也沒有寫出來,最近做物聯網的專案,又用到了這個東西,因此覺得有必要深入研究一番。

言歸正傳。該服務端**可實現,兩個客戶端的定向聊天,客戶端連線服務端的第一件事事就是登陸,用於區別身份。測試方法是,將服務端啟動後,開啟兩個可以收發的客戶端,可以使用tcp除錯助手,第乙個客服端和伺服器連線成功後,傳送client1,注意此時千萬不要發第二幀資料,因為**還沒有作相應的完善,這個時候要先註冊第二個客戶端,連線成功後,傳送client2,這個時候兩個客戶端就註冊成功了,特別注意,當其中乙個客戶端掉線後,另乙個客戶端就不要發資料了,等待新的客戶端註冊成功後再發資料。

下面是服務端**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define serv_port 5001

#define sevr_ip_addr "192.168.32.128"

//已經用不到了

#define backlog 5

//同時允許幾個客戶端正在連線 2*backlog+1

;//儲存閘道器sockfd

;//儲存http伺服器fd

int client_init =0;

//當兩個客戶端都連線成功後,才開始傳送資料

//訊號量

//定義訊號量,初值為0

/******************************************/

//1建立socket fdif(

(fd =

socket

(af_inet, sock_stream,0)

)<0)

int b_reuse =1;

setsockopt

(fd, sol_socket, so_reuseaddr,

&b_reuse,

sizeof

(int))

;//伺服器可以快速重啟

//2繫結

填充struct sockaddr_in結構體變數

bzero

(&sin,

sizeof

(sin));

sin.sin_family = af_inet;

sin.sin_port =

htons

(serv_port)

; sin.sin_addr.s_addr =

htonl

(inaddr_any)

;//和網絡卡無關的ip位址應用

繫結if(

bind

(fd,

(struct sockaddr *

)&sin,

sizeof

(sin)

)<0)

//3 listen()把主動套接字變成被動套接字if(

listen

(fd, backlog)

<0)

//4 阻塞等待客戶端的連線請求

int newfd =-1

; pthread_t tid;

pthread_t tid2;

pthread_t tid3;

struct sockaddr_in cin;

socklen_t addrlen =

sizeof

(cin)

;pthread_create

(&tid2,

null

, sendtogateway,

null);

//建立**執行緒

//建立**執行緒

while(1

)char ipv4_addr[16]

;if(!

inet_ntop

(af_inet,

(void*)

&cin.sin_addr.s_addr, ipv4_addr,

sizeof

(cin)))

//把網路位址變成字串形式的

//對方已關閉

printf

("receive data: %s\n"

, buf)

;//判斷是否是閘道器或者httpif(

//使用者輸入了quit字元

}close

(newfd)

; client_init --

;}

Linux下基於socket多執行緒併發通訊的實現

編譯伺服器端程式 pthread server.c gcc pthread server.c o server lpthread 編譯客戶端程式 pthread client.c gcc pthread client.c o client 編譯在開發板上跑的客戶端程式 arm linux gcc c...

Linux併發(多執行緒協作)

乙個程式裡的執行緒數,就像一家公司裡的員工數一樣,太少了忙不過來,太多了入不敷出。因此我們需要有更好的機制來協調它們。拓展 最理想的情況是 讓程序有一些初始數目的執行緒 所謂的執行緒池 當沒有任務的時候這些執行緒自動進入睡眠,有了任務他們會立即執行任務,不斷迴圈。程序還應該可以根據自身任務的繁重與否...

基於多執行緒併發的單例模式

基於多執行緒併發的單例模式 1 外界不能隨意建立例項 2 通過靜態方法去獲取例項 3 保證類的例項,創用且僅建立一次 getinstance author ganymede public class singleton 需要考慮多執行緒的問題,可能會建立多個單例 多執行緒訪問併發的安全控制 方法上加...