Linux學習 通訊 Socket封裝的優化

2021-09-24 02:39:03 字數 1512 閱讀 5445

本次筆記主要是對上節**的優化。

上節**:linux學習-通訊-socket封裝

如果我們客戶端有多次訊息進行傳送,而有乙個程序一直在占用,上面的**就滿足不了我們的需求。比如一直有個while(1)在占用。

#include#include"mysocketapi.h"

int main(char *argc,char **ar**);

s_fd = socketservercreate(ar**[1],ar**[2]);

while(1)

return 0;

}

這樣客戶端只能傳送一次訊息,因為這裡while(1)死迴圈一直將通道占用。

有以下方法進行優化

1. 使用父子程序優化。

#include#include"mysocketapi.h"

int main(char *argc,char **ar**);

s_fd = socketservercreate(ar**[1],ar**[2]);

while(1) }

return 0;

}

父程序一直在等接受客戶端的訊息,不管子程序進行的如何。就算當前的子程序未執行完,也直接進行下乙個子程序。

2. 使用執行緒進行優化

函式原型:

int pthread_create(pthread_t *restrict tidp,

const pthread_attr_t *restrict attr,

void *(*start_rtn)(void),

void *restrict arg);

tidp為指向執行緒識別符號的指標。返回成功時,由tidp指向的記憶體單元被設定為新建立執行緒的執行緒id。

attr用來設定執行緒屬性。

start_rtn是執行緒執行函式的起始位址,新建立的執行緒從start_rtn函式的位址開始執行。

arg是執行函式的引數。該函式只有乙個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止乙個,那麼需要把這些引數放到乙個結構中,然後把這個結構的位址作為arg的引數傳入。

#include#include"mysocketapi.h"

#includeint c_fd; //c_fd定義為全域性變數

void fun()

; memset(buf,'\0',32); //清空buf

read(c_fd,buf,32);

printf("get msg:%s\n",buf);

while(1); }

int main(char *argc,char **ar**)

return 0;

}

編譯服務端**,這裡見了執行緒後編譯遊戲而變化,多了 -lpthread 如圖:

Linux學習 通訊 Socket封裝

1.進行標頭檔案的編寫 將server.c中的socket函式和client.c中的socket函式封裝進去標頭檔案,這樣就可以直接在服務端或客戶端直接進行呼叫,不需要每次都編寫socket函式。1.1 對server.c進行修改。include include see notes include ...

學習socket通訊總結(一)

最近一直在用linux,很早就想學習linux網路程式設計。今天剛好抽出一段時間,學習了簡單的socket通訊,寫了乙個簡單的客戶端 伺服器通訊 現在將今天學習的內容做乙個總結。一 相關概念說明 struct sockaddr struct sockaddr in int socket int do...

Qt學習 之 Socket通訊

近期寫大作業用到qt的socket部分。網上關於這部分的資料都太過複雜,如今總結一下一些簡單的應用。有機會能夠給大家講講用socket傳送檔案的 這裡主要解說怎樣實現tcp和udp的簡單通訊。在linux下進行網路程式設計。我們能夠使用linux提供的統一的套接字介面。可是這樣的方法牽涉到太多的結構...