socket

Socket与系统调用深度分析

陌路散爱 提交于 2020-02-13 02:21:11
系统linux-5.0.1 32位 为加快大家查看源码的调用关系 提供 https://elixir.bootlin.com/linux/v5.0.1/source/net/ipv4/tcp_ipv4.c#L202 以下调试都是基于下图的理解进行的,针对图中1,2两个点,博文主要解决四个问题 1 int 0x80中断向量是如何与中断向量表绑定的? 2 socketAPI是如何进入内核调用socket 接口的? 3 socket接口是如何与传输层协议绑定的? 4 sokcet接口是如何调用具体协议的 Linux 引导过程综述 BIOS->Bootloader->内核初始化:体系结构相关部分-><内核初始化:体系结构无关部分> 内核初始化:体系结构相关部分 1 内核映像结构 2 初始化与保护模式 3 自解压内核 <4 startup_32(head_32.c)> startup_32(head_32.c) 1 初始化参数(设置段的值,清楚BSS,初始化栈) 2 开启分页机制 3 初始化 Eflags 4 检查处理器类型 5 载入 GDT、IDT <6 i386_start_kernel> i386_start_kernel 执行与体系结构无关部分的内核初始化 1 检查中断向量表(IDT)是否已经启动,em,IDT要被初始化第一次 <2 调用start

socketserver

ぐ巨炮叔叔 提交于 2020-02-12 20:28:09
socketserver SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。 特点: socketserver自带多线程、多进程 socketserver中的两个类,可以解决两个问题: server类:保证一直运行提供服务(连接循环) request类:可以基于一个连接进行通信循环 一 简单示例 二 简单示例二 三 模拟上传、下载功能 1 客户端上传到服务端 2 服务端下载到客户端 一 简单示例 客户端输入,服务端返回大写 ps:基于TCP的socketserver,实现了并发 server: import socketserver class MyFTP(socketserver.BaseRequestHandler): def handle(self): while True: data = self.request.recv(1024) self.request.send(data.upper()) if __name__ == '__main__': obj = socketserver.ThreadingTCPServer(('127.0.0.1', 8484

java nio多路复用 selector

房东的猫 提交于 2020-02-12 19:36:59
文章目录 多路复用selector 多路复用 unix内核中的select/epoll/poll select poll epoll 代码样例 多路复用selector 多路复用 I/O多路复用,I/O是指网络I/O, 多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程;简单来说:就是使用一个或者几个线程处理多个TCP连接;最大优势是减少系统开销小,不必创建过多的进程/线程,也不必维护这些进程/线程;多路复用分为三种形式select/epoll/poll,在 Java 中, Selector 这个类是 select/epoll/poll 的外包类 , 在不同的平台上, 底层的实现可能有所不同, 但其基本原理是一样的, 其原理图如下所示: unix内核中的select/epoll/poll select 函数: int select ( int maxfdp1 , fd_set * readset , fd_set * writeset , fd_set * exceptset , const struct timeval * timeout ) 返回值:就绪描述符的数目,超时返回 0 ,出错返回 - 1 maxfdp1:描述符个数 * readset、 * writeset、 * exceptset:读、写和异常条件的描述字 * timeout

网络七层协议的通俗理解

大兔子大兔子 提交于 2020-02-12 13:28:39
网络七层协议的通俗理解 OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住。今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记。本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人。总体来说,OSI模型是从底层往上层发展出来的。 这个模型推出的最开始,是是因为美国人有两台机器之间进行通信的需求。 需求1: 科学家要解决的第一个问题是,两个硬件之间怎么通信。具体就是一台发些比特流,然后另一台能收到。 于是,科学家发明了物理层: 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。 需求2: 现在通过电线我能发数据流了,但是,我还希望通过无线电波,通过其它介质来传输。然后我还要保证传输过去的比特流是正确的,要有纠错功能。 于是,发明了数据链路层: 定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。 需求3: 现在我能发正确的发比特流数据到另一台计算机了,但是当我发大量数据时候,可能需要好长时间,例如一个视频格式的,网络会中断好多次(事实上,即使有了物理层和数据链路层,网络还是经常中断,只是中断的时间是毫秒级别的

C++socket编程步骤

二次信任 提交于 2020-02-12 09:28:17
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是採用的流式套接字。 server端编程的步骤: 1:载入套接字库,创建套接字(WSAStartup()/socket()); 2:绑定套接字到一个IP地址和一个port上(bind()); 3:将套接字设置为监听模式等待连接请求(listen()); 4:请求到来后,接受连接请求,返回一个新的相应于此次连接的套接字(accept()); 5:用返回的套接字和client进行通信(send()/recv()); 6:返回,等待还有一连接请求; 7:关闭套接字,关闭载入的套接字库(closesocket()/WSACleanup())。 client编程的步骤: 1:载入套接字库,创建套接字(WSAStartup()/socket()); 2:向server发出连接请求(connect()); 3:和server端进行通信(send()/recv()); 4:关闭套接字,关闭载入的套接字库(closesocket()/WSACleanup())。 第一式: 载入/释放Winsock库: 1.载入方法: WSADATA wsa; /*初始化socket资源*/ if (WSAStartup(MAKEWORD(1,1)

java socket通信

拥有回忆 提交于 2020-02-12 09:20:16
socket通信是指两台计算机的两个程序之间的通信,双向链路的每一端都称为一个socket,但分为客户机和服务器。 java.net提供了ServerSocket和Socket类,分别用于服务器和客户端。 通信过程: 建立Socket连接,客户端程序申请连接,服务器端程序监听所有端口,判断是否有客户端的服务器请求,当客户端申请某个端口连接时,服务器将对方的ip和端口号绑定形成套接字,这样服务器和客户机就建立了一个专用虚拟连接,可以相互通信了,通信结束后将虚拟连接拆除。 编程步骤:服务器先建立一个服务器套接字ServerSocket,并指定端口号监听客户机请求,然后建立一个Socket用来和客户机通信,客户机建立端建立同一端口的Socket以便和服务器通信。 java.net包含以上两个类: 主要方法说明: ServerSocket(int port)在指定端口上创建服务器Socket对象 ServerSocket(int port,int count)count 为最大连接数 Sorket(InetAddress IP,int port)使用指定IP和端口建立Socket对象 Sorket(String host,int port)使用指定主机和端口建立Socket对象 以上两个方法有对三个选项 boolean stream(布尔值表示是否选用流式通信) 可以用Socket类的

Java Socket

Deadly 提交于 2020-02-12 09:15:23
什么是Socket Socket的概念很简单,它是 网络上运行的两个程序间双向通讯的一端,既可以接收请求,也可以发送请求,利用它可以较为方便地编写网络上数据的传递 。 所以简而言之,Socket就是进程通信的端点,Socket之间的连接过程可以分为几步: 1、服务器监听 服务器端Socket并不定位具体的客户端Socket,而是处于等待连接的状态,实时监控网络状态 2、客户端请求 客户端Socket发出连接请求,要连接的目标是服务端Socket。为此,客户端Socket必须首先描述它要连接的服务端Socket,指出服务端Socket的地址和端口号,然后就向服务端Socket提出连接请求 3、连接确认 当服务端Socket监听到或者说是接收到客户端Socket的连接请求,它就响应客户端Socket的请求,建立一个新的线程,把服务端Socket的描述发给客户端,一旦客户端确认了此描述,连接就好了。而服务端Socket继续处于监听状态,继续接收其他客户端套接字的连接请求 TCP/IP、HTTP、Socket的区别 这三个概念是比较容易混淆的概念,这里尽量解释一下三者之间的区别。 随着计算机网络体系结构的发展,OSI七层网络模型诞生了,这个模型把开放系统的通信功能划分为七个层次,一次完整的通信如下图: 每一层都是相互独立的,它利用其下一层提供的服务并为其上一层提供服务

windows socket编程

耗尽温柔 提交于 2020-02-12 08:46:05
socket编程是所有协议实现的底层,任何协议都可以用socket来实现。 Winsock启动 winsock服务是以动态链接库Winsock DLL形式实现的,所以必须先对Winsock DLL进行初始化,协商Winsock的版本支持,并分配必要的资源,函数原型为: int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); 参数wVersionRequested用于指定准备加载的Winsock库的版本,高位字节表示副版本,低位字节表示主版本。 lpWSAData是指向WSADATA类型的指针,该结构中包含了加载的库版本相关信息。WSADATA结构如下: typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYSSTATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char *lpVendorInfo; }WSADATA,*LPWSADATA; 举个例子,想加载主版本副版本都为2的Winsock库: WASDATA WSAData;

linux网络编程之socket编程(一)

梦想的初衷 提交于 2020-02-12 08:44:17
今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp/Ip四层模型: 而在说明什么是Socket之前,需要理解下面这些图: 而实际上: 所以: 另外: 这跟管道是不同的,管道只能用于本机的进程间通信。另外socket能用于异构系统间进行通信: IPv4套接口地址结构: 一般不用 为什么要有地址家族呢?因为Socket不仅仅只能用于Tcp/Ip协议,还能用于其它协议,如:Unix域协议,所以一定得指名是哪个家族,如果是IPv4协议,则需要指定为AF_INET,如果是AF_INET6,则就是IPv6协议,这个用得很少~ 16位的无符号整数,也就是两个字节,它能表示的最大的整数为:65535 对于IPv4协议,地址是32位的,也就是四个字节,所以该结构体为无符号的32位整数: 实际上,也可以通过man帮助来看到其结构:man 7 ip 【注意】 :平常编程时,只会用到 sa_family_t、in_port_t、struct in_addr 这三个字段。 通用 地址结构: 该字段总共有14个字节,实际上跟sockaddr_in最后面三个字段的总和是一样大小的: 所以说,通用的地址结构可以兼容IPv4的结构 为什么要有通用地址结构呢?

使用 Python 进行 socket 编程

点点圈 提交于 2020-02-12 08:15:01
本文主要参考 https://docs.python.org/3/howto/sockets.html 。 本文只讨论 STREAME(比如 TCP) INET(比如 IPv4) socket。 在多种 跨进程通信 方式中,sockets 是最受欢迎的。对于任意给定的平台,有可能存在其他更快的跨进程通信方式,但对于跨平台交流,sockets 应该是唯一的一种。 创建 Socket 客户端 Socket 通俗的讲,当你点击一个链接,你的浏览器会做以下事情: # create an INET, STREAMing socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器,如果 URL 中没有指明端口,那么端口为默认的 80 s.connect(("www.python.org", 80)) 建立连接后,可以用 socket s 来发送请求。然后 s 会读取回复,然后被销毁。在一次请求-接收过程(或者一系列连续的小的过程)中,客户端 sockets 通常只会被使用一次。 服务端 Socket 对于 web 服务器来说: # create an INET, STREAMing socket serversocket = socket.socket(socket.AF_INET, socket.SOCK