实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h&g …
linux socket编程指北以下server和client的c代码均拷贝自博客,详细内容请阅读原文。在其上添加了错误码打印,修改了服务端ip和端口,并增加了makefile脚本。server*serve_tcp.c*#include<stdio.h>#include<syssocket.h>#include<netineti …
1. 前言众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向的数据交换, 为 BPF 技术中的重要基础数据结构。在 BPF 程序中可以通过声明 struct bpf_map_def 结构完成创建,这其实带给我们一种错觉,感觉这和普通的 C 语言变量没有区别,然而事实真的是这样的吗?事情远没有这么简单,读完本文以后相信你会有更大的惊喜。str …
1 Linux IO 模型分类相比于kernel bypass 模式需要结合具体的硬件支撑来讲,native IO是日常工作中接触到比较多的一种,其中同步IO在较长一段时间内被广泛使用,通常我们接触到的IO操作主要分为网络IO和存储IO。在大流量高并发的今天,提到网络IO,很容易想到大名鼎鼎的epoll 以及reactor架构。但是epoll并不属于异步IO …
在 TCP 协议中,默认情况下,当我们调用 close() 函数关闭套接口时,TCP 走四次挥手进行断开链路,但是要是若缓冲区还有数据未发送到对端时,系统将尝试把这些数据发送给对端。四次挥手的过程导致我们在 TIME_WAIT 状态下无法复用端口。有些情况下我们不需要 TIME_WAIT, 而是想快速断开连接,从而避免 socket 的堆积。这个时候我们可以 …
当别人问你,在linux系统上,多个程序能不能绑定同一个端口。可能你会不加思索就说了不能。因为在我们的认知中,在linux系统上,一个进程只能绑定一个端口。其实这种认知是不对的,因为我们还有端口复用。那如何做到端口复用呢?也就是多个程序绑定同一个端口。我们可以利用套接字选项(如SO_REUSEADDR和SO_REUSEPORT),用setsockopt进行设 …
liwen01 2019.10.24前言UDP协议是User Datagram Protocol的缩写,它是无连接,不可靠的网络协议。一般使用它进行实时性数据的传输,主要是因为它快,但因为它是不可靠的一种传输协议,所以不可避免的会出现丢包现象。本文就具体讨论导致UDP传输数据包丢失的原因以及一些基本的规避方法:路由器转发造成的数据包丢失数据链路层MTU造成的 …
定义用户数据报协议(UDP,User Datagram Protocol),无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。主要特点无连接的,即通信时不需要创建连接(发送数据结束时也没有连接可以释放)所以减小了开销和发送数据前的时延;采用最大努力交付,不保证可靠交付,因此主机不需要维护复杂的连接状态;面向报文,只在应用层交下来的报文前增加了首部后就 …
libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看struct bufferevent这个结构体struct bufferevent {struct event_base *ev_base;const struct bufferevent_ops *be_ops;st …
一、TCP连接建立与系统调用基础(一)TCP连接建立过程概述1. 三次握手TCP连接建立是基于三次握手机制。首先,客户端向服务器发送一个带有SYN(同步序列号)标志的数据包,请求建立连接。这个数据包中包含了客户端初始的序列号。服务器收到客户端的SYN包后,会回复一个SYN + ACK包。其中,SYN标志表示服务器也同步自己的序列号,ACK标志是对客户端SYN …