POCO庫中文編程參考指南(8)豐富的Socket編程

來源:互聯網
上載者:User

POCO庫中文編程參考指南(8)豐富的Socket編程
  • 作者:柳大·Poechant
  • 部落格:Blog.CSDN.net/Poechant
  • 郵箱:zhongchao.ustc#gmail.com (# -> @)
  • 日期:April 16th, 2012
1 POCO 中的 Socket

POCO 中有 豐富的 Socket 封裝。其繼承關係如下:

本文暫且只介紹 StreamSocket、ServerSocket、DatagramSocket

2 Poco::Net::ServerSocket

ServerSocket 是一個封裝層次比較低(low level)的 Socket,其使用的是 TCP 串連。在實際的 Server 中推薦使用 TCPServer 或 Reactor 架構。下面是常式:

#include "Poco/Net/ServerSocket.h"#include "Poco/Net/SocketStream.h"#include "Poco/Net/StreamSocket.h"#include <iostream>int main(int argc, char **argv){

綁定連接埠,並開始監聽:

    Poco::Net::ServerSocket srv(12345);

服務主迴圈:

    while (true)    {

接受串連:

        Poco::Net::StreamSocket streamSocket = srv.acceptConnection();

向 Socket 發送資料:

        Poco::Net::SocketStream socketStream(streamSocket);        socketStream << "HTTP/1.0 200 OK\r\n"                     << "Content-Type: text/html\r\n"                     << "\r\n"                     << "<html><head><title>My 1st Web Server</title></head></html>"                     << std::flush;    }    return 0;}
3 TCPServer 架構

POCO 提供了一個 TCPServer,顧名思義,是一個 TCP 伺服器。準確的說,TCPServer 是一個 Framework,要求使用 ServerSocket 去 accept 串連。並且在將 ServerSocket 轉遞給 TCPServer 之前必須將其設定為監聽模式。

TCPServer 維護一個串連隊列(connection queue)。TCPServer 開啟多個線程去從串連隊列中取串連並進行處理,線程的數量是動態,與串連隊列中的串連數有關。

非正常串連會被立即關閉,而不會被插入串連隊列。TCPServer 的主線程負責將用戶端發來的請求串連放入串連隊列。

TCPServer 是一個高效的開發框架構,具體詳見《POCO庫中文編程參考指南(10)如何使用TCPServer架構?》一文。

4 Poco::Net::DatagramSocket4.1 UDP Client
#include "Poco/Net/DatagramSocket.h"  #include "Poco/Net/SocketAddress.h"  #include "Poco/Timestamp.h"  #include "Poco/DateTimeFormatter.h"  #include <string>int main(){    const char* ipaddr = "127.0.0.1";    Poco::Net::SocketAddress sa("127.0.0.1", 1234);      Poco::Net::DatagramSocket dgs;    dgs.connect(sa);     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;  }  

不能用:

...const char* ipaddr = "127.0.0.1";Poco::Net::SocketAddress sa("127.0.0.1", 1234);  Poco::Net::DatagramSocket dgs(sa);std::string syslogMsg;  Poco::Timestamp now; ... 

因為 DatagramSocket(SocketAddress) 建構函式是建立一個 DatagramSocket 然後 bind()。而這裡要使用的是 connect()。

4.2 UDP Server
#include "Poco/Net/DatagramSocket.h"#include "Poco/Net/IPAddress.h"#include <iostream>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;}
5 Reactor 架構

Reactor 架構是利用 Event/Notification 實現的基於 Reactor 設計模式的一個伺服器架構,由於 Event/Notification 存在而支援非同步。

具體詳見本博的另一篇博文《POCO庫中文編程參考指南(11)如何使用Reactor架構?》

6 StreamSocket

也是一個 TCP 的 Socket,可以使資料轉送操作變的簡化,被用在 TCP 伺服器和用戶端。

-

轉載請註明來自柳大的CSDN部落格:Blog.CSDN.net/Poechant

-

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.