网络编程
文章平均质量分 78
_李白_
内外兼修,方是正途;外是架构,内是数学。
展开
-
手写一个基于epoll实现的reactor模型
reactor服务器实现代码:/*================================================================* Copyright (C) 2021 baichao All rights reserved.* * 文件名称:reactor.cpp* 创 建 者:baichao* 创建日期:2021年03月07日* 描 述:*=======================================.原创 2021-03-11 00:26:46 · 516 阅读 · 0 评论 -
linux五种io模型:阻塞IO、非阻塞IO、多路复用IO、异步IO、信号驱动IO
1、阻塞IO(blocking IO)在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程如下:当用户调用了read这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有达到(比如,还没有收到一个完整的数据包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户原创 2021-02-23 22:44:14 · 625 阅读 · 0 评论 -
I/O多路复用之select、poll、epoll实例
1、select/* Access macros for `fd_set'. */#define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)#define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp)#define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp)#define FD_ZERO(fdsetp) __FD_ZERO (fds原创 2021-02-22 18:01:28 · 7491 阅读 · 3 评论 -
socket单向断开函数shutdown
因为socket是双向,client和server都可以进行input和output,所以有时候我们需要数据在socket上实现单向的传输,即数据往一个方向传输。单向的socket为半开放Socket。要实现半开放式,需要用到shutdown()函数。函数声明/* Shut down all or part of the connection open on socket FD. HOW determines what to shut down: SHUT_RD = No原创 2021-02-08 20:27:12 · 4699 阅读 · 1 评论 -
一文搞懂TCP数据报结构、三次握手、数据传输过程、丢包与解决方法、四次挥手
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用connect()函数和服务器建立连接。建立连接的目的是保护IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)。可以很形象的比如为下面的对话:[Shake 1] 套接字A:“你好,套接字B,我这里有原创 2021-02-04 23:47:35 · 8167 阅读 · 0 评论 -
TCP的粘包问题以及解决方案
通过socket通信的数据的接收和发送是无关的,read()函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()和write()的执行次数有可能不相同。例如,write()重复执行了三次,每次都发送字符"abc",那么目标机器上的read()可能分三次接收,每次都接收"abc";也可能分两次接收,第一次接收“abcab”,第二次接收“cabc”;也可能一次就接收到字符串“abcabcabc”。假设我们希望客户端每次发送一位学生的学好,让服务器返回该学生的姓名、住址、成绩等信息,这原创 2021-01-28 23:19:46 · 629 阅读 · 3 评论 -
socket缓冲区以及阻塞模式
在简单实现一个linux下的socket server 和 client一文中,我们知道了write()函数发送数据,使用read()函数接收数据,我们下面来看看数据是如何传递的。socket缓冲区每个socket被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()并不立即向网络中传输数据,而是先将数据写入输出缓冲区中,再由TCP协议将数据从输出缓冲区发送到目标机器。一旦将数据写入到输出缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是T原创 2021-01-25 20:32:35 · 886 阅读 · 0 评论 -
setsockopt()和getsockopt()
1、setsockopt()函数头文件:#include <sys/types.h>#include <sys/socket.h>函数声明:int setsockopt(int s,int level,int optname,const void* optval,socklen_toptlen);setsockopt()用来设置参数s 所指定的socket 状态。s:待设置的socket。level:代表欲设置的网络层,一般设为SOL_SOCKET以原创 2021-01-25 19:38:52 · 563 阅读 · 0 评论 -
简单实现一个linux下的socket server 和 client
目录1、linux文件描述符2、在Linux下创建 socket3、bind()函数和connect()函数3.1、bind()函数3.2、connect()函数4、listen()函数和accept()函数4.1、listen()函数4.2、accept()函数5、write()和read()5.1、write()函数5.2、read()函数6、一个service和client的简单实现1、linux文件描述符在linux中,一切都是文件。一个硬件设原创 2021-01-24 08:57:52 · 1273 阅读 · 0 评论 -
协议族和数据传输方式
目录1、协议与协议族(Protocol)2、数据传输方式2.1、SOCK_STREAM2.2、SOCK_DGRAM1、协议与协议族(Protocol)协议(Protocol)就是网络通信的约定,通信的双方必须都遵守才能正常收发数据。协议有很多种,例如TCP、UDP、IP等。通信的双方必须使用同一协议才能通信。协议是一种规范,由计算机组织制定,规定了很多细节,例如,如何建立连接,如何相互识别等。所谓协议族(Protocol Family),就是一组协议(多个协议)的统称。最常见的是原创 2021-01-23 09:59:36 · 288 阅读 · 0 评论