c++网络编程笔记

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库,用于处理字符串流。该库定义了三个类:istringstreamostringstreamstringstream,分别用于从字符串中读取数据、将数据写入字符串和同时进行读取和写入操作。(读取时以空格为边界)

  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差不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值