MFC網路程式設計之 TCP伺服器

2021-10-03 16:09:40 字數 1455 閱讀 5668

平台:windows10企業版,vs2013

1.工程建立,基於對話方塊,新增windows socket 支援

2.從csocket派生出自定義監聽socket類sersoc,建立物件

sersoc::m_socket
注意概念:伺服器的監聽socket永遠只是用來接受連線請求。執行通訊,即資料收發時使用的是通訊socket。

3.建立套接字

m_socket.create(server_port);

//主機ip位址由自身網路ip決定

4.監聽

m_socket.listen();
5.sersoc重寫onaccpet()函式,用於管理已連線的客戶端的資訊,將客戶端通訊套接字指標存入鍊錶中管理。

需要提前建立自定義通訊socket類consoc(同樣繼承於csocket)。

6.資料傳送:

sock->send(buf.data(), buf.size());注意資料型別的轉換。(sock是consoc的物件指標)
7.資料接收:

重寫consoc的onreceieve
8.需要重寫的函式及被呼叫時間說明

i. csersocket::onaccept:

客戶端傳送連線請求時呼叫,可決定是否進行連線、對客戶端進行管理等

ii.cconsocket::onsend:

當伺服器和客戶端成功建立好連線(即sersocket::accept()成功之後),

伺服器的通訊套接字自動呼叫此函式,以通知連線好的客戶端可以使用send()函式傳送訊息了

iii.cconsocket::onreceive:

當對方傳送訊息,自動呼叫此函式,可以在函式內做內容接收處理

iv.cconsocket::onclose:

當與本cconsocket連線的客戶端主動退出連線時,此函式被呼叫。

9.概念理解

監聽套接字可理解為接待員,處於監聽狀態時,介紹來訪者(客戶端通訊套接字)與被訪人(伺服器通訊套接字)認識。建立好連線後,監聽套接字不參與通訊過程。

乙個連線由伺服器ip,伺服器端口port,客戶端ip客戶端port四個值唯一決定。一般來說,伺服器ip由所處網路自動分配(本機使用dhcp(動態主機配置協議)),埠則由m_socket.create(server_port)時的引數決定。

乙個埠在同一時間只能有乙個監聽socket處於監聽狀態(這是由於乙個埠只能繫結乙個socket,而監聽listen之前需要進行繫結bind),若嘗試給同一埠進行多次監聽則會報錯。但乙個埠可以建立多個連線,只要各客戶端的ip或port不完全相同即可。

將連線好的通訊套接字的物件指標存到鍊錶中,再將鍊錶設為可全域性訪問,有利於程式的編寫與客戶端的管理。鍊錶中的每個物件即對應乙個連線。

MFC Socket網路程式設計之TCP伺服器端

tcp ip與osi7層參考模型的對應關係 osi的第12層也就是物理層 和資料鏈路層 對應於tcp ip的網路介面 osi的第3層網路層對應tcp ip的網路層 osi的傳輸層對應tcp ip的傳輸層 osi的567層也就是會話層,表示層,應用層 對應tcp ip的應用層 osi參考模型並不是真正...

網路基礎篇 socket程式設計之TCP伺服器

1.socket程式設計 這些函式名很好記,h標示host 主機 n標示network 網路 l表示32位長整數,s表示16位短整數。struct sockaddr socket位址的資料型別 ipv4位址用用sockaddr in結構體來表示,ipv6用sockaddr in6結構體表示。unix...

伺服器TCP網路程式設計實踐

這個問題涉及到2個tcp連線狀態,close wait與time wait。我想描述清楚這2個狀態,將會對伺服器關閉的生命週期了解的更為清晰。1 定義 假設有伺服器a正在執行,接受從客戶端c傳送過來的連線。在某個時間點上,c正常關閉了連線 一般正常關閉是使用close函式 此時伺服器在recv函式上...