C 基於Socket套接字的網路通訊封裝

2021-06-25 23:38:37 字數 3757 閱讀 7035

之所以要進行socket套接字通訊庫封裝,主要是直接使用套接字進行網路通訊程式設計相對複雜,特別對於初學者而言。實際上微軟從.net 2.0開始已經提供了tcp、udp通訊高階封裝類如下:

tcplistener

tcpclient

udpclient

微軟從.net 4.0開始提供基於task任務的非同步通訊介面。而直接使用socket封裝庫,很多socket本身的細節沒辦法自行控制,本文目就是提供一種socket的封裝供參考。文中展示部分封裝了tcp通訊庫,udp封裝也可觸類旁通:

custcplistener

custcpclient

tcp服務端封裝了服務端本地繫結、監聽、接受客戶端連線,並提供了網路資料流的介面。完整**:

public class custcplistener

}protected bool active

}public endpoint localendpoint

return this.mserversocket.localendpoint;}}

public networkstream datastream

return networkstream;}}

public custcplistener(ipendpoint localep)

public custcplistener(string localaddr, int port)

this.mserversocketendpoint = new ipendpoint(ipaddress.parse(localaddr), port);

this.mserversocket = new socket(this.mserversocketendpoint.addressfamily, sockettype.stream, protocoltype.tcp);

}public custcplistener(int port)

public void start()

/// /// 開始伺服器監聽

///

/// 同時等待連線的最大個數(半連線佇列個數限制)

public void start(int backlog)

if (this.mserversocket == null)

this.mserversocket.bind(this.mserversocketendpoint);

this.mserversocket.listen(backlog);

this.isactive = true;

}public void stop()

this.isactive = false;

this.mserversocket = new socket(this.mserversocketendpoint.addressfamily, sockettype.stream, protocoltype.tcp);

}public socket acceptsocket()

public custcpclient accepttcpclient()

}

tcp客戶端封裝了客戶端本地繫結、連線伺服器,並提供了網路資料流的介面。完整**:

public class custcpclient : idisposable

protected bool active

public ipendpoint clientsocketendpoint

public bool isconnected }

public networkstream datastream

return networkstream;}}

public custcpclient(ipendpoint localep)

this.client = new socket(localep.addressfamily, sockettype.stream, protocoltype.tcp);

this.active = false;

this.client.bind(localep);

this.clientsocketendpoint = localep;

}public custcpclient(string localaddr, int port)

ipendpoint localep = new ipendpoint(ipaddress.parse(localaddr), port);

this.client = new socket(localep.addressfamily, sockettype.stream, protocoltype.tcp);

this.active = false;

this.client.bind(localep);

this.clientsocketendpoint = localep;

}internal custcpclient(socket acceptedsocket)

public void connect(string address, int port)

ipendpoint remoteep = new ipendpoint(ipaddress.parse(address), port);

this.connect(remoteep);

}public void connect(ipendpoint remoteep)

this.client.connect(remoteep);

this.active = true;

}public void close()

protected virtual void dispose(bool disposing)

else

}gc.suppressfinalize(this);}}

public void dispose()

}

控制台程式試驗,服務端程式:

class program

private static void listenerclientconnection()

port=",

tcpclient.clientsocketendpoint.address, tcpclient.clientsocketendpoint.port);

thread thread = new thread(datahandleprocess);

thread.isbackground = true;

thread.start(tcpclient);}}

private static void datahandleprocess(object obj)

catch (exception)

thread.sleep(5);}}

}

客戶端程式:

class program

private static void userprocess()

次,內容:", i, "測試通訊");

console.writeline("傳送資料:", str);

sw.writeline(str);

}break;}}

}

通訊成功:

補充:目前有很多優秀的開源socket框架,比如supersocket、fastsocket等。

網路套接字(socket)

include uint32 t htonl uint32 t hostlong 主機位元組序轉網路位元組序 uint32 t htons uint32 t hostshort uint32 t ntohl uint32 t hostlong 網路位元組序轉主機位元組序 uint32 t ntohl...

網路 Socket套接字

socket介面在讀寫資料時,都是按字串的方式接收的,若要傳輸乙個 結構化的資料 就需要使用序列化和反序列化。序列化是將資料由多變到一的過程,反序列化是將資料由一分為多的過程。ip位址唯一標識公網當中的一台主機 埠號唯一標識互聯 定主機上的特定程序。每一對埠號加ip位址能夠唯一標識網路中一台主機上唯...

socket網路套接字

爬蟲的概念 爬蟲的應用 1.資料採集 大資料時代來臨,資料就是核心,資料就是生產力,越來越多的企業開始注重收集使用者資料,而爬蟲技術是收集資料的一種重要手段。2.搜尋引擎 3.模擬操作 爬蟲也被廣泛用於模擬使用者操作,測試機械人,灌水機械人等。爬蟲難點主要分為兩個方向 資料的獲取 網路公共資源都是為...