1. UDP协议:
UDP是无连接的,所以思想和TCP不一样。
UDP的客户端和服务端都各只有一个socket,没有ServerSocket和ClientSocket的概念。
使用recvfrom和sendto来发送和接收信息。
sendto的地址结构体参数必须填写发送的目标地址;recvfrom的地址结构体参数由函数来填充,因此不需要知道消息来自哪个地址的话可以填NULL。如果说服务端接收到一个客户端的消息然后想给它发消息,就要存储这个客户端的地址。
server端bind绑定地址后可以直接发送和接收,client创建socket后直接收发。
两个长度变量类型socklen_t和ssize_t:

UDP组播
组播只能在局域网中进行。

setsockopt之前要创建一个mreq结构体,作为setsockopt的倒数第二个参数。第二个参数是IPPROTO_IP,第三个参数是IP_ADD_MEMBERSHIP。
2. HTTP协议:
http协议是应用层协议(TCP是传输层),http是基于TCP做的,所以很像。只要TCP传输的数据符合http的数据规范,就可以说是http。


接触到一个新的库:sstream库,用于处理字符串流。该库定义了三个类:istringstream、ostringstream和stringstream,分别用于从字符串中读取数据、将数据写入字符串和同时进行读取和写入操作。(读取时以空格为边界)

fstream库:最常用的三个类是ofstream,ifstream,fstream,用法如下:



fstream库和unsitd库有点像,都可以打开文件,读写文件,区别如下:
![]()
sstream
函数atoi():把字符串转换为一个整数(类型为 int 型)。
rdbuf 是 C++ 标准库中流类如 std::istream, std::ostream, std::fstream, std::stringstream 等的一个重要成员函数,用于直接操作与流关联的底层流缓冲区。
用法:
流重定向: 这是rdbuf最经典的用法。你可以将一个流的输出重定向到另一个流。
文件流与字符串流互操作: 将文件内容快速读入字符串,或将字符串内容快速写入文件。
在浏览器上访问方法:地址:端口/请求内容。
3.boost.asio
在 C++ 中,流(Stream) 是用于处理输入输出(I/O)的抽象概念,表现为数据的有序流动。它通过类库提供统一的接口,屏蔽底层设备差异,使程序能与键盘、屏幕、文件等设备进行数据交互。

上面这段代码,streambuf类型是流缓冲区,boost::asio::read_until 需要特定类型的参数。实现了从自定义的缓冲区 buf 中读取一行文本数据到字符串 msg中。
std::getline用于从输入流中读取一行数据,知道遇到换行符或指定的分隔符。
4. 多线程网络聊天室
线程使用std::thread库。创建一个线程之后,要么使用detach分离线程,要么用join等待线程结束。如果不join也不detach,线程对象析构时程序会崩溃。

谓词函数是一个返回布尔值的函数或函数对象,这里一般用lambda函数。
map的每个元素都是pair类型。
5.高并发

epoll就是基于Reactor模型实现的。
epoll是linux内核提供的。 windows上的io多路复用模型:select


一个装线程的vector容器,推荐用下面第一种写法,直接传构造一个线程所需要的参数,而不是构造好一个线程在传进去。
![]()
压力与性能测试:处理1000个连接仅需要3.7ms,每秒处理连接数20000以上。
线程池,内存池和日志系统对于高并发聊天室服务器也是必不可少的。
6. libevent
安装后使用ldconfig -p | grep libevent查看位置
libevent也是reactor模型,和epoll差不多。




549

被折叠的 条评论
为什么被折叠?



