首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux系统下socket编程之socket接口介绍(一)

其实在写这篇文章开始之前,原本想打算先介绍一下TCP/IP协议的内容,但是在网上看了一些博客,大概都讲的差不多,随便找几篇博客来看(https://developer.51cto.com/art/201906/597961.htm),你就会对这个协议有一个大概的了解(有些地方或许读者和我一样可能也看的不是很明白,但是这对编程阻碍不大),所以我也不打算写这个了(理由是,自己也比较菜,只要大概了解一下这部分内容就行,在日后学习或者工作当中遇到什么不理解的地方再去深入学,比较有针对性;所以侧重点还是在编程上,最终实现理论转到实践当中去,才是王道)。不过经典的TCP三次握手和四次挥手告别,这个基本你必须要明白,这里简单介绍一下,那么就开始今天的内容了。

01

sock基础编程介绍

一、套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。它们允许程序接受并进行连接,如发送和接受数据。为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要。 套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳。许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持。 三种最流行的套接字类型是:stream,datagram和raw。stream和datagram套接字可以直接与TCP协议进行接口,而raw套接字则接口到IP协议。但套接字并不限于TCP/IP。 二、套接字模块 套接字模块是一个非常简单的基于对象的接口,它提供对低层BSD套接字样式网络的访问。使用该模块可以实现客户机和服务器套接字。要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块。利用该模块包含的函数和类定义,可生成通过网络通信的程序。一般来说,建立服务器连接需要六个步骤。 第1步是创建socket对象。调用socket构造函数。 socket=socket.socket(familly,type) family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字)。 第2步则是将socket绑定(指派)到指定地址上,socket.bind(address) address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。 第3步,绑定后,必须准备好套接字,以便接受连接请求。 socket.listen(backlog) backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。 第4步,服务器套接字通过socket的accept方法等待客户请求一个连接: connection,address=socket.accept() 调用accept方法时,socket会进入'waiting'(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有俩个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。 第5步是处理阶段,服务器和客户通过send和recv方法通信(传输数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入'blocket'状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。 第6步,传输结束,服务器调用socket的close方法以关闭连接。 建立一个简单客户连接则需要4个步骤。 第1步,创建一个socket以连接服务器 socket=socket.socket(family,type) 第2步,使用socket的connect方法连接服务器 socket.connect((host,port)) 第3步,客户和服务器通过send和recv方法通信。 第4步,结束后,客户通过调用socket的close方法来关闭连接。

01

Kubernetes 中的 eBPF

BPF (Berkeley Packet Filter) 最早是用在 tcpdump 里面的,比如 tcpdump tcp and dst port 80 这样的过滤规则会单独复制 tcp 协议并且目的端口是 80 的包到用户态。整个实现是基于内核中的一个虚拟机来实现的,通过翻译 BPF 规则到字节码运行到内核中的虚拟机当中。最早的论文是这篇,这篇论文我大概翻了一下,主要讲的是原本的基于栈的过滤太重了,而 BPF 是一套能充分利用 CPU 寄存器,动态注册 filter 的虚拟机实现,相对于基于内存的实现更高效,不过那个时候的内存比较小才几十兆。bpf 会从链路层复制 pakcet 并根据 filter 的规则选择抛弃或者复制,字节码是这样的,具体语法就不介绍了,一般也不会去直接写这些字节码,然后通过内核中实现的一个虚拟机翻译这些字节码,注册过滤规则,这样不修改内核的虚拟机也能实现很多功能。

02

CAN 接口测试[通俗易懂]

1.sudo modprobe vcan 加载虚拟can模块 2.sudo ip link add dev vcan0 type vcan 添加vcan0网卡 3.ifconfig -a 可以查到当前can网络 can0 can1,包括收发包数量、是否有错误等等 4.ip link set can0 up type can bitrate 800000 //ip link set can0 type can –help 设置can0的波特率为800kbps,CAN网络波特率最大值为1Mbps 5.ip link set can0 up type can bitrate 800000 loopback on 设置回环模式,自发自收,用于测试是硬件是否正常,loopback不一定支持 6. ip link set can0 down 关闭can0 网络 7.cansend can0 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 发送默认ID为0x1的can标准帧,数据为0x11 22 33 44 55 66 77 88 每次最大8个byte 8.cansend can0 -i 0x800 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 -e -e 表示扩展帧,CAN_ID最大29bit,标准帧CAN_ID最大11bit -i表示CAN_ID 9. cansend can0 -i 0x02 0x11 0x12 –loop=20 –loop 表示发送20个包 10.candump can0 接收CAN0数据

03

Go中原始套接字的深度实践

原始套接字(raw socket)是一种网络套接字,允许直接发送/接收更底层的数据包而不需要任何传输层协议格式。平常我们使用较多的套接字(socket)都是基于传输层,发送/接收的数据包都是不带TCP/UDP等协议头部的。 当使用套接字发送数据时,传输层在数据包前填充上面格式的协议头部数据,然后整个发送到网络层,接收时去掉协议头部,把应用数据抛给上层。如果想自己封装头部或定义协议的话,就需要使用原始套接字,直接向网络层发送数据包。 为了便于后面理解,这里统一称应用数据为 payload,协议头部为 header,套接字为socket。由于平常使用的socket是建立在传输层之上,并且不可以自定义传输层协议头部的socket,约定称之为应用层socket,它不需要关心TCP/UDP协议头部如何封装。这样区分的目的是为了理解raw socket在不同层所能做的事情。

02
领券