C 實現及時通訊軟體

2021-08-17 18:59:16 字數 3438 閱讀 3165

**實驗樓教程:c++實現即時通訊軟體

伺服器端:

socket()建立監聽socket

bind()繫結伺服器端口

listen()監聽客戶端連線

accept()接受連線

recv/send接收及傳送資料

close()關閉socket

客戶端:

socket()建立監聽socket

connect()連線伺服器

recv/send接收及傳送資料

close()關閉socket

使用socket()建立tcp套接字(socket)

將建立的套接字繫結到乙個本地位址和埠上(bind)

將套接字設為監聽模式,準備接收客戶端請求(listen)

等待客戶請求到來: 當請求到來後,接受連線請求,返回乙個對應於此次連線的新的套接字(accept)

用accept返回的套接字和客戶端進行通訊(使用write()/send()或send()/recv() )

返回,等待另乙個客戶請求

關閉套接字

建立套接字(socket)

使用connect()建立到達伺服器的連線(connect)

客戶端進行通訊(使用write()/send()或send()/recv())

使用close()關閉客戶連線

通常的,對乙個檔案描述符指定的檔案或裝置, 有兩種工作方式: 阻塞與非阻塞方式。

阻塞方式是指: 當試圖對該檔案描述符進行讀寫時,如果當時沒有資料可讀,或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。

非阻塞方式是指: 如果沒有資料可讀,或者不可寫,讀寫函式馬上返回,而不會等待。

舉個例子來說,比如說小明去找乙個女神聊天,女神卻不在。如果小明捨不得走,只能在女神大門口死等著,當然小明可以休息。當女神來了,她會把你喚醒(囧,因為擋著她門了),這就是阻塞方式。如果小明發現女神不在,立即離開,以後每隔十分鐘回來看一下(採用輪詢方式),不在的話仍然立即離開,這就是非阻塞方式,在他離開的十分鐘內可以幹別的事情。epoll是linux下多路復用io介面select/poll的增強版本。其實現和使用方式與select/poll有很多不同,epoll通過一組函式來完成有關任務,而不是乙個函式。

epoll之所以高效,是因為epoll將使用者關心的檔案描述符放到核心裡的乙個事件表中,而不是像select/poll每次呼叫都需要重複傳入檔案描述符集或事件集。比如當乙個事件發生(比如說讀事件),epoll無須遍歷整個被偵聽的描述符集,只要遍歷那些被核心io事件非同步喚醒而加入就緒佇列的描述符集合就行了。

epoll有兩種工作方式,lt(level triggered):水平觸發和et(edge-triggered):邊沿觸發。lt是select/poll使用的觸發方式,比較低效;而et是epoll的高速工作方式(本專案使用epoll的et方式)。

通俗理解就是,比如說有一堆女孩,有的很漂亮,有的很鳳姐。現在你想找漂亮的女孩聊天,lt就是你需要把這一堆女孩全都看一遍,才可以找到其中的漂亮的(就緒事件);而et是你的小弟(核心)將n個漂亮的女孩編號告訴你,你直接去看就好,所以epoll很高效。另外,還記得小明找女神聊天的例子嗎?採用非阻塞方式,小明還需要每隔十分鐘回來看一下(select);如果小明有小弟(核心)幫他守在大門口,女神回來了,小弟會主動打**,告訴小明女神回來了,快來處理吧!這就是epoll。

最簡單聊天室的群聊,執行緒池、多執行緒程式設計、超時重傳確認收包等都不涉及,考慮有兩個以下程式

伺服器:能接受新的客戶端的連線,並將每個客戶端發過來的訊息發給所有其他的客戶端

客戶端:能夠連線伺服器,並向伺服器傳送訊息,同時接收伺服器發過來的任何訊息

需求中的角色非常簡單,同時功能也很簡單,所以我們只需要根據功能角色設計客戶端類和服務端類。

其中客戶端類我們需要支援下面幾個功能:

連線伺服器

支援使用者輸入聊天訊息,傳送訊息給伺服器

接收並顯示伺服器的訊息

退出連線

針對上述需求,客戶端的實現需要兩個程序分別支援下面的功能:

子程序的功能:

等待使用者輸入聊天資訊

將聊天資訊寫到管道(pipe),並傳送給父程序

父程序的功能:

使用epoll機制接受服務端發來的資訊,並顯示給使用者,使使用者看到其他使用者的聊天資訊

將子程序發給的聊天資訊從管道(pipe)中讀取, 並傳送給服務端

服務端類需要支援:

支援多個客戶端接入,實現聊天室基本功能

啟動服務建立監聽埠等待客戶端連線

使用epoll機制實現併發,增加效率

客戶端連線時傳送歡迎訊息並儲存連線記錄

客戶端傳送訊息時廣播給其他所有客戶端

客戶端請求退出時對連線資訊進行清理

common.h:公共標頭檔案,包含所需的所有巨集定義及socket網路程式設計標頭檔案

client.h, client.cpp:客戶端類實現。

server.h,server.cpp:服務端類實現。

clientmain.cpp servermain.cpp:客戶端及服務端的主函式。

web 及時通訊

關於輪詢方式web及時通訊的簡單總結 http 1.1開始支援keep alive,keep alive指的是客戶端和伺服器建立一次tcp連線後,可以在這個連線上發生多次 http request response,但由於http協議本身是無狀態的,所以每次發生http請求時仍都要進行http 頭部...

測試及時通訊工具

來自 51testing軟體測試論壇 測試像qq那樣的及時通訊 工具,應該如何測試?1 首先以核心功能為中心進行測試工作的部署 比如 關鍵功能或核心功能 收發等等 因為有可能聯動一些其他輔助功能,事先進行規劃部署 2 綜合利用場景分析法進行測試用例的編寫 比如 實際收發各種情況的模擬 通訊線路的模擬...

C WebSocket 及時通訊協議

1 什麼是websocket websocket使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。在websocket api中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以建立永續性的連線,並進行雙向資料傳輸。2 websocket和socket區別 原理上的區...