muduo程式設計示例2019 11 02

2021-09-29 15:24:32 字數 3345 閱讀 2217

//discard 長連線應用層協議,關注:訊息/資料到達事件。

void discardserver::onmessage(const tcpconnectionptr& conn,

buffer* buf,

timestamp time)

string msg(buf->retrieveallasstring());

log_info << conn->name() << " discards " << msg.size()

<< " bytes received at " << time.tostring();

daytime 短連線協議,傳送完後,伺服器主動斷開。關注連線已建立事件。

void discardserver::onconnection(const tcpconnectionptr& conn)

log_info << "discardserver - " << conn->peeraddress().toipport() << " -> "

<< conn->localaddress().toipport() << " is "

<< (conn->connected() ? "up" : "down");

time 返回乙個32-bit的整數。表示從1970-01-01 00:00:00z到現在的秒數。關注連線已建立事件。

void timeserver::onconnection(const muduo::net::tcpconnectionptr& conn)

log_info << "timeserver - " << conn->peeraddress().toipport() << " -> "

<< conn->localaddress().toipport() << " is "

<< (conn->connected() ? "up" : "down");

if (conn->connected())

time_t now = ::time(null);

int32_t be32 = sockets::hosttonetwork32(static_cast(now));

conn->send(&be32, sizeof be32);

conn->shutdown();

chargen協議只傳送資料,不接收資料。關注訊息/資料傳送完畢事件。

muduo把主動關閉連線這件事分為兩步,如果主動關閉連線,它會先關閉寫端,等對方關閉之後,再關本地的讀端。

tcpconnection物件析構的時候,正式關閉。

可以從/proc/pid/fd中查詢沒有關閉的檔案描述符。

設計目標:開發公司內部分布式程式。

網路程式設計使用protobuf需要解決兩個問題:長度,型別。

長度:protobuf打包資料沒有自帶長度資訊或終結符,需要有應用程式自己在發生和接受的時候做正確的切分。

型別:protobuf打包的資料沒有自帶型別資訊,需要由傳送方把型別資訊傳給接收方,接收方建立具體的protobuf message物件,再做反序列化。

長度:通常在每個訊息前面加固定長度的length header.

型別:protobuf對此有內建的支援。

一種做法是:protobuf data之前加上header,header中包含訊息長度和型別資訊。

型別資訊的「山寨」做法主要兩種:

1、在header中放int typeid,接收方用switch-case來選擇對於的訊息型別和處理函式;

2、在header中放string typename,接收方用look-up table來選擇對應的訊息型別和處理函式。

muduo多機協作網路程式設計示例一 單詞計數及排序

去年我寫了 muduo 網路程式設計示例 系列文章,這些文章已經收入 linux 多執行緒服務端程式設計 使用 muduo c 網路庫 一書。這些文章講的基本都是執行在單機上的網路程式,每個例子都只有乙個程式 第7.13節例外 我接下來打算繼續寫幾篇文章,談一談分布在多台機器上 協作發揮作用的網路程...

Linux socket CAN程式設計示例

如下所示,展示了linux下can的傳送和接收 include include include include include include include include include define command sbin ip link set can0 type can bitrate ...

shell程式設計示例

is root.sh bin bash 通過環境變數判斷 test env grep user cut d f 2 if test root then echo current user is root.else echo not root.fi注意 給指令碼賦予執行許可權,如 chmod 755 ...