Linux學習 通訊 Socket封裝

2021-09-24 02:37:00 字數 3807 閱讀 5314

1. 進行標頭檔案的編寫

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

1.1 對server.c進行修改。

#include #include /* see notes */

#include #include #include //#include #include #include //標頭檔案不發生改變。

int socketservercreate(char *ip,char *port) //自定義函式名,這裡傳參由main函式傳

s_addr.sin_family=af_inet;

s_addr.sin_port=htons(atoi(port));

inet_aton(ip,&s_addr.sin_addr);

bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

listen(s_fd,10);

return s_fd;

}//做到listen()函式即可

1.2. 對client.c進行修改。

#include #include /* see notes */

#include #include #include //#include #include #include int socketclientcreate(char*ip,char *port)//自定義函式名,這裡傳參由main函式傳

c_addr.sin_family=af_inet;

c_addr.sin_port=htons(atoi(port));

inet_aton(ip,&c_addr.sin_addr);

int c_connect=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));

if(c_connect==-1)

return c_fd;//返回客戶端通訊的識別符號。

}

1.3 將server.c和client.c合併寫自己的封裝函式

#include #include /* see notes */

#include #include #include //#include #include #include //服務端部分

int socketservercreate(char *ip,char *port)

s_addr.sin_family=af_inet;

s_addr.sin_port=htons(atoi(port));

inet_aton(ip,&s_addr.sin_addr);

bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

listen(s_fd,10);

return s_fd;

}//客戶端部分

int socketclientcreate(char*ip,char *port)

c_addr.sin_family=af_inet;

c_addr.sin_port=htons(atoi(port));

inet_aton(ip,&c_addr.sin_addr);

int c_connect=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));

if(c_connect==-1)

return c_fd;

}

自定義封裝函式名,我這裡用的是mysocketapi.c

1.4 編寫標頭檔案

標頭檔案僅需要mysocketapi.c中的頭部分和宣告部分即可。

#include #include /* see notes */

#include #include #include //#include #include #include int socketservercreate(char *ip,char *port);//記得加分號

int socketclinentcreate(char*ip,char *port);

自定義頭函式名,我這裡用的是mysocketapi.h

1.5總結

經過以上4個步驟,標頭檔案已經成功地寫好,後面編寫server.c和client.c時,只需要呼叫標頭檔案中的socketsocketcreate()和socketclinentcreate()即可。

2.兩端**編寫以及編譯

2.1server.c的編寫

#include#include"mysocketapi.h"//這裡用「」而不用<>的原因,下文會解釋

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

s_fd = socketservercreate(ar**[1],ar**[2]);//僅用一行**呼叫標頭檔案中的函式。

while(1)

return 0;

}

2.2client.c的編寫

#include#include"mysocketapi.h"

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

return 0;

}

2.3 兩端**的編譯如果**中用的<>寫標頭檔案,如下圖:

會提示找不到標頭檔案,如圖:

原因:編譯器在編譯時候會預設從/user / include /資料夾下面去找標頭檔案。而我們自己封裝的標頭檔案不在此目錄。這裡有兩種解決辦法。

方法①:將宣告標頭檔案中的<>改為「」即可。如圖:

改為引號之後,編譯器編譯時就會從當前目錄尋找這個標頭檔案。

找不到時候再去/user / include /尋找。

再次編譯時候會出現這個問題。如圖:

提示找不到socketservercreate這個函式,這裡需要將socket.c和mysocketapi.c一起編譯即可。

方法②:不改變宣告標頭檔案中的<>

在編譯時候知名標頭檔案的位置。這裡用-i來知名標頭檔案位址,如圖:

解決編譯問題後,將客戶端端**也編譯。如圖;

3.執行兩端**

執行服務端**:

執行客戶端**:

服務端接收到資訊:

Linux學習 通訊 Socket封裝的優化

本次筆記主要是對上節 的優化。上節 linux學習 通訊 socket封裝 如果我們客戶端有多次訊息進行傳送,而有乙個程序一直在占用,上面的 就滿足不了我們的需求。比如一直有個while 1 在占用。include include mysocketapi.h int main char argc,c...

學習socket通訊總結(一)

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

Qt學習 之 Socket通訊

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