套接字

线程同步与异步套接字编程(一)

♀尐吖头ヾ 提交于 2019-12-03 22:49:13
前面三章我们介绍了多线程同步处理方法是创建互斥对象来实现多线程同步运行。这章我们讲解如何运用事件对象来处理线程同步: 事件对象也是属于内核对象,其包含三个成员:1.使用计数;2.用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值;3.用于指明该事件处于已通知状态还是未通知状态的布尔值。 事件对象有两种不同的类型:人工重置的事件对象和自动重置的事件对象。 事件对象的创建函数为HANDLE CreateEvent,-------用于创建或者打开一个命名的或匿名的事件对象。 1 CreateEvent( 2 LPSECURITY_ATTRIBUTES lpEventAttributes, 3 BOOL bManualReset, 4 BOOL bInitialState, 5 LPCWSTR lpName 6 ); 参数说明: 安全属性,如果为NULL,则使用默认的安全性; 人工重置,如果为true,则表示该函数将创建一个人工重置事件对象;否则为自动重置对象; 事件对象状态初始化,如果为true,表示该事件对象初始值是有信号状态;否则是无信号状态; 事件对象名称,如果为NULL,表示创建一个匿名的事件对象。 重置事件对象状态函数: BOOL ResetEvent(HANDLE hEvent); 设置事件对象状态函数: BOOL SetEvent(HANDLE hEvent)

套接字联网相关的函数调用

為{幸葍}努か 提交于 2019-12-03 20:27:17
socket函数 int socket(int protofamily, int type, int protocol); //返回sockfd,即描述符 功能 : socket 函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而 socket() 用于创建一个 socket 描述符(socket descriptor),它唯一标识一个 socket。这个 socket 描述字跟文件描述符一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 参数 : protofamily:即协议域,又称为协议族(family)。常用的协议族有,AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或称 AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如 AF_INET 决定了要用 ipv4 地址(32位的)与端口号(16位的)的组合、AF_UNIX 决定了要用一个绝对路径名作为地址。 type:指定 socket 类型。常用的 socket 类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。 protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP

笔记: Java NIO套接字通信

北城以北 提交于 2019-12-03 18:24:54
这篇文章是一个月前看一本Java7的书写的笔记,觉得蛮重要,就把他加在博客里面。多废话一句,国产技术书害人,看的时候这部分书完全没说清楚,最后还是查API文档和自己写Demo搞了一晚上才基本理解过去了,笔记里面添加了很多自己的理解,算原创吧。 一 套接字通道 1. 阻塞式套接字通道 与Socket和ServerSocket对应,NIO提供了SocketChannel和ServerSocketChannel对应,这两种通道同时支持一般的阻塞模式和更高效的非阻塞模式。 客户端通过SocketChannel.open()方法打开一个Socket通道,如果此时提供了SocketAddress参数,则会自动开始连接,否则需要主动调用connect()方法连接,创建连接后,可以像一般的Channel一样的用Buffer进行读写,这都是阻塞模式的。 服务器端通过ServerSocketChannel.open()创建,并使用bind()方法绑定到一个监听地址上,最后调用accept()方法阻塞等待客户端连接。当客户端连接后会返回一个SocketChannel以实现与客户端的读写交互。 总的来说,阻塞模式即是net包I/O的翻版,只是采用Channel和Buffer实现而已。 2.多路复用套接字通道(Selector实现的非阻塞式IO) 套接字通道多路复用的思想是创建一个Selector

IPv4,IPv6套接字地址结构

喜欢而已 提交于 2019-12-03 15:00:22
1.IPv4套接字地址结构 struct in_addr{   in_addr_t s_addr;//unsigned int }; struct sockaddr_in{   //uint8_t sin_len 这个字段可能在其他系统上有,我的系统是ubuntu 19.04 下面介绍的地址结构类似   sa_familiy_t sin_family;//unsigned short   in_port_t sin_port;//unsigned short   struct in_addr sin_addr;   unsigned char sin_zero[sizeof(struct sockaddr) - \ sizeof(sa_familiy_t) - sizeof(in_port_t) - sizeof(struct in_addr)]; }; sin_family指明了属于哪个协议族。sin_port指明了端口号(0-65535),sin_addr.s_addr指明了网络二进制字节序值。sin_zero可以从上面看出就是用了填充字节的,使得该结构和sockaddr通用套接字地址结构的大小相同。 2.通用套接字地址结构是什么? 通用套接字地址结构主要是为了方便处理不同协议族的套接字地址结构,即在需要传递套接字地址结构时通常采用struct sockaddr *sa作为形参

Java 网络编程

风格不统一 提交于 2019-12-03 12:18:43
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。 java.net 包中提供了两种常见的网络协议的支持: TCP :TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。 UDP :UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。 本教程主要讲解以下两个主题。 Socket 编程 :这是使用最广泛的网络概念,它已被解释地非常详细。 URL 处理 :这部分会在另外的篇幅里讲,点击这里更详细地了解在 Java 语言中的 URL 处理。 Socket 编程 套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。 当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。 java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。 以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

套接字缓存skb

吃可爱长大的小学妹 提交于 2019-12-03 12:03:46
一. SKB_BUFF的基本概念 1. 一个完整的skb buff组成 (1) struct sk_buff--用于维护socket buffer状态和描述信息 (2) header data--独立于sk_buff结构体的数据缓冲区,用来存放报文分组,使各层协议的header存储在连续的空间中,以方便协议栈对其操作 (3) struct skb_shared_info --作为header data的补充,用于存储ip分片,其中sk_buff *frag_list是一系列子skbuff链表,而frag[]是由一组单独的page组成的数据缓冲区 skb buff结构图如下: struct skb_buff 表示接收或发送数据包的包头信息,其成员变量在从一层向另一层传递时会发生修改。例如L3向L2传递前,会添加一个L3的头部,所以在添加头部前调用skb_reserve在缓冲区的头部给协议头预留一定的空间;L2向L3传递时候,L2的头部只有在 网络驱动处理L2的协议时有用,L3是不会关心它的信息的。但是,内核不会把L2的头部从缓冲区中删除, sk_buff->h sk_buff->nh sk_buff->mac 指向TCP/IP各层协议头的指针:h指向L4(传输层),nh指向L3(网络层),mac指向L2(数据链路层)。每个指针的类型都是一个联合, 包含多个数据结构, sk_buff-

redis模型(1):单线程模型

流过昼夜 提交于 2019-12-03 12:03:12
1、文件事件处理器 Redis基于Reactor模式开发了自己的网络事件处理器,被称为文件事件处理器,由套接字、I/O多路复用程序、文件事件分派器(dispatcher),事件处理器四部分组成。 I/O多路复用程序会同时监听多个套接字,当被监听的套接字准备好执行accept、read、write、close等操作时,与操作相对应的文件事件就会产生,I/O多路复用程序会将所有 产生事件的套接字 都压入一个队列,然后以有序地每次仅一个套接字的方式传送给文件事件分派器,文件事件分派器接收到套接字后会根据套接字产生的事件类型调用对应的事件处理器。 注意1:只有当上一个套接字产生的事件被所关联的事件处理器执行完毕,I/O多路复用程序才会继续向文件事件分派器传送下一个套接字,所以对每个命令的执行时间是有要求的,如果某个命令执行过长,会造成其他命令的阻塞。所以慎用O(n)命令,Redis是面向快速执行场景的数据库。 注意2:命令的并发性。Redis是单线程处理命令,命令会被逐个被执行,假如有3个客户端命令同时执行,执行顺序是不确定的,但能确定不会有两条命令被同时执行,所以两条incr命令无论怎么执行最终结果都是2。 2、事件 服务器需要处理两类事件: 2.1、文件事件 : Redis服务器对套接字的操作,当一个套接字准备执行连接、读、写、关闭等操作时就会产生一个文件事件。文件事件分为AE

套接字选项

▼魔方 西西 提交于 2019-12-03 11:46:47
之前读过unix网络编程,现在在看nginx源码,很多套接字选项不记得了,因此每遇到一个套接字选项就在此文章中进行补充。 1.获取和设置套接字选项的方法: getsockopt,setsockopt函数 fcntl函数 ioctl函数 2.4种函数简介: I.getsockopt,setsockopt函数 int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen); int setsockopt(int sockfd,nt level,int optname,const void* optval,socklen_t optlen); sockfd必须是一个打开的套接字描述符,level指定系统中解释选项的代码或为通用套接字代码或为某个特定于协议的代码。optval 是一个指向某个变量的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则将获取的选项值放入*optval中。*optval的大小由最后一个参数指定,因此,获取或者设置的数据类型一定要一一对应。 3.套接字选项: 这里我将分不同的level来进行描述,但套接字选项可能和书上的顺序不同,标志字段为0表示禁用,否则启用。 I.SOL_SOCKET SO_KEEPALIVE,可获得,可设置

基于tcp协议的套接字通信:远程执行命令

拥有回忆 提交于 2019-12-03 07:26:38
1.struct模块 #1、把整型数字转成bytes类型 #2、转成的bytes是固定长度的 import struct import json header_dic = { 'total_size': 31222222222121, 'md5': '123svsaef123sdfasdf', 'filename': 'a.txt' } #序列化:内存中的数据结构----》转成一种中间格式(字符串)----》存到文件中 header_json=json.dumps(header_dic) print(header_json,type(header_json)) #编码:编码后的结果为bytes类型 header_bytes=header_json.encode('utf-8') header_size=len(header_bytes) print(header_size) # 81 #打包 obj=struct.pack('i',header_size) print(obj,len(obj)) # b'Q\x00\x00\x00' 4 #解包 obj2=struct.unpack('i',obj) print(obj2) # (81,) View Code 打印结果: {"total_size": 31222222222121, "md5":

网络编程技术-----6、I/O复用实现并发服务器

落花浮王杯 提交于 2019-12-03 07:09:06
网络编程技术-----6、I/O复用实现并发服务器 一、实验要求 服务器:     服务器等待接收客户的连接请求,一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,对接收的字符串按分组进行加密(分组长度为个人学号,密钥为个人序号,分组不够补0),再将加密后的字符发回客户端;之后继续等待接收该客户的信息,直到客户关闭连接,服务器将每个连接的用户所发来的所有数据存储起来,当连接终止后,服务器将显示客户的名字及相应的所有数据。要求服务器具有同时处理多个客户请求的能力。 客户端:     客户首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,指导用户输入的是quit,则关闭连接并退出。 二、实验环境 OS:kali 计算机语言:C 编译器:gcc IDE:VsCode 三、I/O复用涉及到的函数 **FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。** **FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。** *