C++ POCO库中文编程参考指南(8) 富厚的Socket编程
当前位置:以往代写 > C/C++ 教程 >C++ POCO库中文编程参考指南(8) 富厚的Socket编程
2019-06-13

C++ POCO库中文编程参考指南(8) 富厚的Socket编程

C++ POCO库中文编程参考指南(8) 富厚的Socket编程

1 POCO 中的 Socket

POCO 中有 富厚的 Socket 封装。其担任干系如下:

C++ POCO库中文编程参考指南(8) 丰硕的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::DatagramSocket
4.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

查察全套文章:http://www.bianceng.cn/Programming/cplus/201301/35022.htm

    关键字:

在线提交作业