socket通訊服務端 c 實現tcp網路通訊

2021-10-17 23:50:25 字數 3771 閱讀 6422

@[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...