本次筆記主要是對上節**的優化。
上節**:linux學習-通訊-socket封裝
如果我們客戶端有多次訊息進行傳送,而有乙個程序一直在占用,上面的**就滿足不了我們的需求。比如一直有個while(1)在占用。
這樣客戶端只能傳送一次訊息,因為這裡while(1)死迴圈一直將通道占用。#include#include"mysocketapi.h"
int main(char *argc,char **ar**);
s_fd = socketservercreate(ar**[1],ar**[2]);
while(1)
return 0;
}
有以下方法進行優化
1. 使用父子程序優化。
父程序一直在等接受客戶端的訊息,不管子程序進行的如何。就算當前的子程序未執行完,也直接進行下乙個子程序。#include#include"mysocketapi.h"
int main(char *argc,char **ar**);
s_fd = socketservercreate(ar**[1],ar**[2]);
while(1) }
return 0;
}
2. 使用執行緒進行優化
函式原型:
tidp為指向執行緒識別符號的指標。返回成功時,由tidp指向的記憶體單元被設定為新建立執行緒的執行緒id。int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void),
void *restrict arg);
attr用來設定執行緒屬性。
start_rtn是執行緒執行函式的起始位址,新建立的執行緒從start_rtn函式的位址開始執行。
arg是執行函式的引數。該函式只有乙個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止乙個,那麼需要把這些引數放到乙個結構中,然後把這個結構的位址作為arg的引數傳入。
編譯服務端**,這裡見了執行緒後編譯遊戲而變化,多了 -lpthread 如圖:#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;
}
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提供的統一的套接字介面。可是這樣的方法牽涉到太多的結構...