热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

POCO库中文编程参考指南(8)丰富的Socket编程作者:柳大·Poechant博客:Blog.CSDN.netPoechant邮箱:zhongchao.ustc#gmail.com(#-&g

POCO库中文编程参考指南(8)丰富的Socket编程
  • 作者:柳大·Poechant
  • 博客:Blog.CSDN.net/Poechant
  • 邮箱:zhongchao.ustc#gmail.com (# -> @)
  • 日期:April 16th, 2012

1 POCO 中的 Socket

POCO 中有 丰富的 Socket 封装。其继承关系如下:

Resize icon

本文暂且只介绍 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

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"                     <<""                     <

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 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 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 <

5 Reactor 框架

Reactor 框架是利用 Event/Notification 实现的基于 Reactor 设计模式的一个服务器框架,由于 Event/Notification 存在而支持异步。

具体详见本博的另一篇博文《POCO库中文编程参考指南(11)如何使用Reactor框架?》

6 StreamSocket

也是一个 TCP 的 Socket,可以使数据传输操作变的简化,被用在 TCP 服务器和客户端。

-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

-


推荐阅读
  • 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
    转载自:http:blog.csdn.nethulihuiarticledetails3244520原文:HowtousetheSocketAsyncE ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 本文介绍了如何使用OpenXML按页码访问文档内容,以及在处理分页符和XML元素时的一些挑战。同时,还讨论了基于页面的引用框架的局限性和超越基于页面的引用框架的方法。最后,给出了一个使用C#的示例代码来按页码访问OpenXML内容的方法。 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • 并不是上一个用SocketServer的聊天室的延续。用远程调用完成的聊天室。正好有Java的RMI聊天室的作业,就先用Python写了一个简单的类似远程调用的东西& ... [详细]
  • Socketsend函数和recv函数详解send函数intsend(SOCKETs,constcharFAR*buf,intlen,intflags);不论是客户还是服务器应用程 ... [详细]
  • java local socket_网络通信之Socket与LocalSocket的比较
    Socket与LocalSocket都可以实现网络通信,两个有什么区别呢?LocalSocket其通信方式与Socket差不多,只是Loc ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有