POCO库中文编程参考指南(8)丰富的Socket编程
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::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 服务器和客户端。
-
from:http://blog.csdn.net/Poechant/article/details/7467971
POCO库中文编程参考指南(8)丰富的Socket编程的更多相关文章
- POCO库中文编程参考指南(4)Poco::Net::IPAddress
POCO库中文编程参考指南(4)Poco::Net::IPAddress 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmai ...
- POCO库中文编程参考指南(3)Poco::Net::Socket
POCO库中文编程参考指南(3)Poco::Net::Socket 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.c ...
- POCO库中文编程参考指南(2)基本数据类型(Poco/Types.h)
POCO库中文编程参考指南(2)基本数据类型 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> ...
- POCO库中文编程参考指南(1)总览
POCO库中文编程参考指南(1)总览 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> @) ...
- POCO库中文编程参考指南(11)如何使用Reactor框架?
1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...
- POCO库中文编程参考指南(10)如何使用TCPServer框架?
1 TCPServer 框架概述 POCO 库提供TCPServer框架,用以搭建自定义的 TCP 服务器.TCPServer维护一个连接队列.一个连接线程池.连接线程用于处理连接,连接线程只要一空闲 ...
- c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用writ ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
随机推荐
- 视频服务之ffmpeg部署
FFmpeg介绍 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. 采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案. 它包含了非常先进 ...
- c# 根据读取的配置信息删除某个目录及下所有文件
#region 定时删除目录文件 /// <summary> /// 定时删除目录文件 /// northeasttycoon /// </summary> /// <p ...
- Java中如何判断一个日期字符串是否是指定的格式
判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date ...
- 九度OJ 1178:复数集合 (插入排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8393 解决:1551 题目描述: 一个复数(x+iy)集合,两种操作作用在该集合上: 1.Pop 表示读出集合中复数模值最大的那个复数,如 ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- 我的Java开发学习之旅------>Workspace in use or cannot be created, choose a different one.--错误解决办法
今天使用Eclipse时,突然卡死了,然后我强制关闭了Eclipse,再重新打开的时候就报错了,错误如下: Workspace in use or cannot be created, choose ...
- X86/X64处理器体系结构及寻址模式
由8086/8088.x86.Pentium发展到core系列短短40多年间,处理器的时钟频率差点儿已接近极限.尽管如此,自从86年Intel推出386至今除了添加一些有关流媒体的指令如mmx/sse ...
- 序列化组件(get/put/delete接口设计),视图优化组件
一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...
- 杂草丛生HTML5网站模板
杂草丛生HTML5个人网站模板是一款野草到处生长的HTML5网站模板下载. 模板地址:http://www.huiyi8.com/sc/8780.html
- JS 删除数组中指定的某个元素的方法
//首先创建函数方法 Array.prototype.indexOf = function(val){ for(var i=0;i<this.length;i++){ if(this[i] == ...