首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

深入解析 POCO 庫中的 Socket 編程:從基礎到進階框架

     編輯:關於C++

POCO 網絡模塊中的 Socket 體系

POCO C++ 庫提供了豐富的 Socket 封裝,其類繼承結構清晰,核心類包括 StreamSocket、ServerSocket、DatagramSocket 等。本文將重點介紹這三類 Socket 的使用方式,並簡要說明 TCPServer 與 Reactor 兩大高層框架。

1. 低層級 TCP 服務端:ServerSocket

Poco::Net::ServerSocket 是一個較低層級的 TCP Socket 封裝,適合簡單的服務端開發。實際生產環境中,推薦使用 TCPServer 或 Reactor 框架以獲得更好的並發性能。

基本用法示例

#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/SocketStream.h"
#include "Poco/Net/StreamSocket.h"
#include 

int main(int argc, char **argv) {
    // 綁定端口 12345 並開始監聽
    Poco::Net::ServerSocket srv(12345);

    // 服務主循環
    while (true) {
        // 接受客戶端連接
        Poco::Net::StreamSocket streamSocket = srv.acceptConnection();

        // 向 Socket 發送數據(此處模擬簡單的 HTTP 響應)
        Poco::Net::SocketStream socketStream(streamSocket);
        socketStream << "HTTP/1.0 200 OK\r\n"
                     << "Content-Type: text/html\r\n"
                     << "\r\n"
                     << "My 1st Web Server"
                     << std::flush;
    }
    return 0;
}

2. 高性能 TCP 服務框架:TCPServer

TCPServer 是一個完整的 TCP 服務器框架,內部維護一個連接隊列,並動態調度多個工作線程從隊列中取出連接進行處理。主線程負責將新連接放入隊列,非正常連接會被立即關閉。

使用 TCPServer 時,必須先將 ServerSocket 設置為監聽模式,然後傳遞給 TCPServer。詳細用法請參考《POCO庫中文編程參考指南(10)如何使用TCPServer框架?》。

3. UDP 通信:DatagramSocket

Poco::Net::DatagramSocket 提供了 UDP 協議的封裝,支持客戶端與服務端雙向通信。

3.1 UDP 客戶端示例

#include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Timestamp.h"
#include "Poco/DateTimeFormatter.h"
#include 

int main() {
    Poco::Net::SocketAddress sa("127.0.0.1", 1234);
    Poco::Net::DatagramSocket dgs;
    dgs.connect(sa);  // 必須使用 connect() 而非構造函數綁定

    std::string syslogMsg;
    Poco::Timestamp now;
    syslogMsg = Poco::DateTimeFormatter::format(now, "<14>%w %f %H:%M:%S Hello,world!");
    dgs.sendBytes(syslogMsg.data(), syslogMsg.size());
    return 0;
}

注意: 不能使用 DatagramSocket(SocketAddress) 構造函數,因為該構造函數會調用 bind(),而客戶端需要的是 connect()。

3.2 UDP 服務端示例

#include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/IPAddress.h"
#include 

int main(int argc, char **argv) {
    Poco::Net::SocketAddress socketAddress(Poco::Net::IPAddress(), 1234);
    Poco::Net::DatagramSocket datagramSocket(socketAddress);
    char buffer[1024];

    while (true) {
        Poco::Net::SocketAddress sender;
        int n = datagramSocket.receiveFrom(buffer, sizeof(buffer) - 1, sender);
        buffer[n] = '\0';
        std::cout << sender.toString() << ": " << buffer << std::endl;
    }
    return 0;
}

4. 事件驅動框架:Reactor

Reactor 框架基於 Reactor 設計模式,利用 Event/Notification 機制實現異步 I/O,適合高並發場景。詳細介紹請見《POCO庫中文編程參考指南(11)如何使用Reactor框架?》。

5. StreamSocket:簡化的 TCP 數據傳輸

StreamSocket 同樣基於 TCP,提供了更簡便的數據傳輸操作,常用於 TCP 客戶端與服務端的通信層。

POCO Socket 類繼承關係圖


轉載請注明來自柳大的 CSDN 博客:Blog.CSDN.net/Poechant

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved