socket函数

Java I/O 模型的演进

柔情痞子 提交于 2019-12-07 01:31:06
相关概念 同步和异步 阻塞和非阻塞 Unix I/O 模型 阻塞 I/O 非阻塞 I/O I/O 多路复用(异步阻塞 I/O) 信号驱动 I/O(SIGIO) 异步 I/O 几种 I/O 模型的比较 常见 Java I/O 模型 “阻塞I/O”模式 改进为“阻塞I/O+多线程”模式 改进为“阻塞I/O+线程池”模式 改进为“非阻塞I/O”模式 改进为“异步I/O”模式 源码 参考引用 原文同步至 http://waylau.com/java-io-model-evolution/ 什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型。而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 Java I/O 模型来提高系统的并发量和可用性。 由于,Java 的 I/O 依赖于操作系统的实现,所以先了解 Unix 的 I/O 模型有助于理解 Java 的 I/O。 相关概念 同步和异步 描述的是用户线程与内核的交互方式: 同步 是指用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行; 异步 是指用户线程发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 阻塞和非阻塞 描述的是用户线程调用内核 I/O 操作的方式

Java I/O 模型的演进

a 夏天 提交于 2019-12-07 00:09:36
什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型。而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 Java I/O 模型来提高系统的并发量和可用性。 由于,Java 的 I/O 依赖于操作系统的实现,所以先了解 Unix 的 I/O 模型有助于理解 Java 的 I/O。 相关概念 同步和异步 描述的是用户线程与内核的交互方式: 同步 是指用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行; 异步 是指用户线程发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 阻塞和非阻塞 描述的是用户线程调用内核 I/O 操作的方式: 阻塞 是指 I/O 操作需要彻底完成后才返回到用户空间; 非阻塞 是指 I/O 操作被调用后立即返回给用户一个状态值,无需等到 I/O 操作彻底完成。 一个 I/O 操作其实分成了两个步骤:发起 I/O 请求和实际的 I/O 操作。 阻塞 I/O 和非阻塞 I/O 的区别在于第一步,发起 I/O 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 I/O ,如果不阻塞,那么就是非阻塞 I/O 。 同步 I/O 和异步 I/O 的区别就在于第二个步骤是否阻塞,如果实际的 I/O

以C语言为例完成一个hello/hi的简单的网络聊天程序

自闭症网瘾萝莉.ら 提交于 2019-12-06 15:11:08
本实验是在ubuntu系统下实现一个简单的客户端和服务端通信的简单demo,以TCP协议为例。 首先介绍API: server用到的API有socket,bind,listen,accept,read,write,close (read和write可以用send和recv替换) client用到的API有socket,connect,read,write,close (read和write可以用send和recv替换) 下面来看一下各个API的声明和描述,用man查看各个api声明: 因为linux系统把一切都当做文件来看待,所以像操作文件一样来操作socket文件描述符,写入数据就是发送数据,读数据就是接收数据,这种做法 符合linux系统的一切都当做文件来看待的设计理念。当然也可以用send和recv函数,read和write底层调用的跟send和recv的实现是一样的。 上面就是各种API的介绍,总结来说; socket函数主要是来定义是使用流数据还是数据报数据,对应的就是TCP和UDP协议,TCP的负载对传输层来说是没有数据结构的概念的, 对于上层调用write函数,只是将数据放到发送缓冲区,每次write就只是把数据放到发送缓冲区的最后,就是排队放在后面,完全没有结构的概念, 没有一次write是属于一个报文,而UDP就是一次发送就是一个报文

linux内核参数sysctl.conf,TCP握手ack,洪水攻击syn,超时关闭wait;

强颜欢笑 提交于 2019-12-06 14:36:38
题记:优化Linux内核sysctl.conf参数来提高服务器并发处理能力 PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高Linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器,如果使用Apache的可以启用其Worker模式,来提高其并发处理能力。除此之外,在考虑节省成本的情况下,可以修改Linux的内核相关TCP参数,来最大的提高服务器性能。当然,最基础的提高负载问题,还是升级服务器硬件了,这是最根本的。 Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。 本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量: #netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

WebSocket

不羁的心 提交于 2019-12-06 05:42:43
一 . WebSocket原理   1.1.背景 WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动请求。   1.2.相同点 1.都是基于TCP的应用层协议。 2.都使用Request/Response模型进行连接的建立。 3.在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。 4.都可以在网络中传输数据。   1.3.不同点 1.WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用。 2.WS的连接不能通过中间人来转发,它必须是一个直接连接。 3.WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据。 4.WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。 5.WS的数据帧有序。 6.WebSocket 分为握手和数据传输   1.4.WebSocket的握手 客户端的握手如下: GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example

socket 发送字符串0x00时被截断

风流意气都作罢 提交于 2019-12-06 02:55:16
发送数据如下: aa 02 02 00 00 00 6f 6b 02 00 00 00 55 数据是以字符数组的形式(char msg[])存储发送的,send时发送长度填写的strlen(msg), 导致发送的数据长度只有3, 打印出来是"aa 02 02". 也就是说16进制0x00后面的数据被截断。 通过百度得出资料,strlen函数以及printf函数等遇到 0x00(字符串null)会截断。 来源: https://www.cnblogs.com/rohens-hbg/p/11959317.html

C语言实现FTP服务器

微笑、不失礼 提交于 2019-12-05 15:20:26
公共部分代码 /* common.h */ #ifndef COMMON_H #define COMMON_H #include <arpa/inet.h> #include <ctype.h> #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #define DEBUG 1 #define MAXSIZE 512 #define CLIENT_PORT_ID 30020 struct command { char arg[255]; char code[5]; }; int socket_create(int port); int socket_accept(int sock_listen); int socket_connect(int port, char *host); int recv_data(int sockfd, char*

Windows 非阻塞或异步 socket

北城余情 提交于 2019-12-05 13:34:04
异步与非阻塞区别见我的另外一篇文章 Socket 同步/异步与阻塞/非阻塞区别 select WSAAsyncSelect WSAEventSelect 重叠(Overlapped)I/O IOCP:完成端口 Select 首先要使用ioctlsocket设置为非阻塞模式。 然后启动线程,线程中不停select。 WSAAsyncSelect WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。此模型提供了读写数据能力的异步通知,但不提供异步数据传送。需要在消息响应函数里send(一般为resend)和receive。由于该模型基于Windows消息机制, 必须在应用程序中创建窗口 。虽然可以在开发中,确定是否显示该窗口。 WSAEventSelect 通常与WSACreateEvent、WSAResetEvent、WSACloseEvent、WSAWaitForMultileEvents和WSAEnumNetworkEvents一起使用,无需创建窗口。 WSAWaitForMultileEvents 检查是否有Event, WSAEnumNetworkEvents 枚举事件类型, FD_READ、 FD_WRITE等。 函数最多可以支持WSA_MAXIMUM_WAIT

2019-2020-1 20175311 20175324 20175330 实验三实时系统

此生再无相见时 提交于 2019-12-05 11:21:59
2019-2020-1 20175311 20175324 20175330 实验三实时系统 任务一 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 使用多线程实现wc服务器并使用同步互斥机制保证计数正确 实验操作 任务一 : 实现wc功能实现 客户端给服务器传文件功能 在客户端调用wc函数统计传过来的文件的单词个数 wc命令参数:- 用wc命令做到只打印统计数字不打印文件名:cat test.txt |wc -l -c 统计字节数。 -l 统计行数。 -m 统计字符数。这个标志不能与 -c 标志一起使用。 -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L 打印最长行的长度。 -help 显示帮助信息 --version 显示版本信息 服务器代码: #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include <sys/socket.h> // for socket #include <stdio.h> // for printf #include <stdlib.h> // for exit

关不掉的小姐姐程序python tkinter实现 学习---打包教程

风流意气都作罢 提交于 2019-12-05 08:51:14
基本思路:将动态gif图的每一帧图片存储到一个数组里面,然后调用after()方法不断的去循环更新图片 代码沿用前面介绍的( 关不掉的小姐姐程序python tkinter实现 学习---打包教程 )的代码,这个代码能看懂的话,下面的代码也就很好理解了,就多了一个 update()函数,里面调用了after()函数对图片不断更新 import tkinter as tk#这个语句导入tkinter模块,但为方便,为它定义了一个别名tk。 import os import tkinter.messagebox #messagebox是普通windows编程中经常用到的,目的是显示个信息框 import base64#要将编码之后的图片数据解码并保存为图片 import os#我们删除图片,这个要添加进来 from main_w_gif import img as socket_one #接下来就是在文件中导入你刚刚生成的xxx.py文件,因为每个图片文件里面都是img变量,所以导入的时候可以用别名,这是python的基本用法了,不再多说。 from not_gif import img as socket_two from sure_gif import img as socket_three tmp = open('socket_one.gif', 'wb') #这是解码。保存图片