1. 進行標頭檔案的編寫
將server.c中的socket函式和client.c中的socket函式封裝進去標頭檔案,這樣就可以直接在服務端或客戶端直接進行呼叫,不需要每次都編寫socket函式。
1.1 對server.c進行修改。
1.2. 對client.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.3 將server.c和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;//返回客戶端通訊的識別符號。
}
自定義封裝函式名,我這裡用的是mysocketapi.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;
}
1.4 編寫標頭檔案
標頭檔案僅需要mysocketapi.c中的頭部分和宣告部分即可。
自定義頭函式名,我這裡用的是mysocketapi.h#include #include /* see notes */
#include #include #include //#include #include #include int socketservercreate(char *ip,char *port);//記得加分號
int socketclinentcreate(char*ip,char *port);
1.5總結
經過以上4個步驟,標頭檔案已經成功地寫好,後面編寫server.c和client.c時,只需要呼叫標頭檔案中的socketsocketcreate()和socketclinentcreate()即可。
2.兩端**編寫以及編譯
2.1server.c的編寫
2.2client.c的編寫#include#include"mysocketapi.h"//這裡用「」而不用<>的原因,下文會解釋
int main(char *argc,char **ar**);
s_fd = socketservercreate(ar**[1],ar**[2]);//僅用一行**呼叫標頭檔案中的函式。
while(1)
return 0;
}
2.3 兩端**的編譯如果**中用的<>寫標頭檔案,如下圖:#include#include"mysocketapi.h"
int main(char *argc,char **ar**)
return 0;
}
會提示找不到標頭檔案,如圖:
原因:編譯器在編譯時候會預設從/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提供的統一的套接字介面。可是這樣的方法牽涉到太多的結構...