@[toc]
本文介紹的是freecplus框架的tcp/ip協議網路通訊的函式和類。
函式和類的宣告檔案是freecplus/_freecplus.h。
函式和類的定義檔案是freecplus/_freecplus.cpp。
示例程式位於freecplus/demo目錄中。
編譯規則檔案是freecplus/demo/makefile。
freecplus框架對socket通訊封裝如下:
ctcpclient類:socket通訊的客戶端類。
ctcpserver類:socket通訊的服務端類。
tcpread函式:接收socket的對端傳送過來的資料。
tcpwrite函式:向socket的對端傳送資料。
readn函式:從已經準備好的socket中讀取資料。
writen函式:向已經準備好的socket中寫入資料。
在閱讀本文章之前,您必須熟悉tcp/ip協議和socket通訊,本文是介紹的是freecplus框架中網路通訊的類和函式的用法,不會介紹網路通訊的基礎知識。
freecplus框架的socket通訊報文格式如下:
報文長度+報文內容
報文長度為4位元組的整數,表示的是報文內容的長度,而不是整個tcp報文的長度,整個tcp報文的長度是報文內容的長度+4。
報文長度是4位元組的整數,即int,是以二進位製流的方式寫入socket,不是ascii碼。
採用ctcpclient類、ctcpserver類、tcpread函式和tcpwrite函式進行socket通訊,可以避免tcp報文粘包的問題。
socket通訊的客戶端封裝在ctcpclient類中。
類的宣告:
// socket通訊的客戶端類
class ctcpclient
;
socket通訊的服務端封裝在ctcpserver類中。
類的宣告:
// socket通訊的服務端類
class ctcpserver
;
示例(demo47.cpp)
/*
* 程式名:demo47.cpp,此程式演示採用freecplus框架的ctcpclient類實現socket通訊的客戶端。
*/#include "../_freecplus.h"
int main(int argc,char *ar**)
char strbuffer[1024]; // 存放資料的緩衝區。
for (int ii=0;ii<5;ii++) // 利用迴圈,與服務端進行5次互動。
// 程式直接退出,析構函式會釋放資源。
}
示例(demo48.cpp)
/*
* 程式名:demo48.cpp,此程式演示採用freecplus框架的ctcpserver類實現socket通訊的服務端。
*/#include "../_freecplus.h"
int main(int argc,char *ar**)
if (tcpserver.accept()==false) // 等待客戶端連線。
printf("客戶端(%s)已連線。n",tcpserver.getip());
char strbuffer[1024]; // 存放資料的緩衝區。
while (true)
printf("客戶端已斷開。n"); // 程式直接退出,析構函式會釋放資源。
}
我希望您已經學過計算機網路的基礎知識,在執行示例程式之前,請確保您的linux作業系統已開通防火牆。
在demo47.cpp和demo48.cpp程式中,服務端的ip位址和通訊埠是寫死在程式中的,請根據您的實際情況修改它們,然後重新編譯。
先啟動demo48,然後啟動demo47。
demo47的執行效果如下:
demo48的執行效果如下:
採用ctcpclient和ctcpserver類實現socket通訊功能非常方便,但是在實際開發中,某些場景中不能只依賴這兩個類,例如多程線和非同步通訊等場景,還必須結合以下將要介紹的幾個函式一起使用。
接收socket的對端傳送過來的資料。
函式的宣告:
bool tcpread(const int sockfd,char *buffer,int *ibuflen,const int itimeout=0);
引數說明:
sockfd:可用的socket連線。
ibuflen:本次成功接收資料的位元組數。
itimeout:接收等待超時的時間,單位:秒,預設值是0-無限等待。
返回值:true-成功;false-失敗,失敗有兩種情況:1)等待超時;2)socket連線已不可用。
在ctcpclient和ctcpserver類的read方法中呼叫了tcpread函式。
向socket的對端傳送資料。
函式的宣告:
bool tcpwrite(const int sockfd,const char *buffer,const int ibuflen=0);
引數說明:
sockfd:可用的socket連線。
ibuflen:待傳送資料的位元組數,如果傳送的是ascii字串,ibuflen取0,如果是二進位製流資料,ibuflen為二進位制資料塊的大小。
返回值:true-成功;false-失敗,如果失敗,表示socket連線已不可用。
在ctcpclient和ctcpserver類的write方法中呼叫了tcpread函式。
從已經準備好的socket中讀取資料。
函式的宣告:
bool readn(const int sockfd,char *buffer,const size_t n);
sockfd:已經準備好的socket連線。
n:本次接收資料的位元組數。
返回值:成功接收到n位元組的資料後返回true,socket連線不可用返回false。
注意:1)sockfd是已經準備好的socket連線,那什麼是已經準備好的socket?在這個socket上,已經或馬上有n位元組的資料一定會到達。
2)成功接收到n位元組的資料後返回true,如果沒有n位元組的資料怎麼辦?不會,在1)中已經說明了,一定會有n位元組的資料會到達。
3)如果資料大於n位元組怎麼辦?readn只讀取n個位元組的資料,其它的資料屬於其它的報文。
4)socket的對端是採用writen方法寫入的資料。
在tcpread函式中,呼叫了readn函式。
向已經準備好的socket中寫入資料。
函式的宣告:
bool writen(const int sockfd,const char *buffer,const size_t n);
sockfd:已經準備好的socket連線。
n:待傳送資料的位元組數。
返回值:成功傳送完n位元組的資料後返回true,socket連線不可用返回false。
在tcpwrite函式中,呼叫了writen函式。
UDP通訊(服務端)
根據網上的資源修改的 include include include pragma comment lib,ws2 32.lib int server void int main int argc,char argv int server void local.sin family af inet ...
通過socket進行網路通訊(服務端)
宣告 此文只是為自己方便理解,做了一些具象的比喻和假設,並不符合客觀事實,謹慎閱讀!在一台主機中,兩個程序想要通訊可以通過乙個管道 檔案 乙個從管道的一端寫,乙個從另一端讀 然而管道是半雙工的 如果乙個程序既想讀又想寫 那就建立兩個管道。利用socket進行網路通訊的過程與之類似 將對方主機抽象成乙...
socket 實現客戶端與服務端通訊
python內的socket已經預設實現了tcp和udp兩種傳輸協議。本文通過乙個簡單的例子記錄一下socket的簡單使用方法。實現 客戶端和服務端通過tcp協議通訊,客戶端向服務端傳送訊息,服務端接收訊息後新增 too 字串後返回給客戶端,客戶端可以主動斷開連線。服務端 import socket...