socket

Linux TCP并发请求溺出 调优

懵懂的女人 提交于 2020-03-15 12:33:30
TCP并发请求溺出 调优:系统开启某个监听端口后,当多个TCP请求连接监听端后,会把多个请求交给backlog的默认监听队列由socket server一并处理,backlog有自己的队列长度默认128,当机器处理能力较慢且并发请求值较高时就要考虑对backlog队列进行调优。 注:backlog就是socket的监听队列,当一个请求尚未被处理或建立时,他会进入backlog。 注:socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 TCP内核参数修改 调优 修改文件:/etc/sysctl.conf 生效命令:sysctl -p /etc/sysctl.conf # 用于设置内核无法及时处理网络接口收到的数据包时允许发送到队列的最大数据包数目,默认为128。 net.core.netdev_max_backlog = 32768 # 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制 net.core.somaxconn= 32768# 表示SYN队列的长度,默认值为1024,此处加大队列长度为65535,可以容纳更多等待连接的网络连接数。net.ipv4.tcp_max_syn_backlog=65535 注

Socket编程中的强制关闭与优雅关闭及相关socket选项

 ̄綄美尐妖づ 提交于 2020-03-15 06:43:54
以下描述主要是针对windows平台下的TCP socket而言。 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议,这里不详细描述了。而关闭socket是指关闭用户应用程序中的socket句柄,释放相关资源。但是当用户关闭socket句柄时会隐含的触发TCP连接的关闭过程。 TCP连接的关闭过程有两种,一种是优雅关闭(graceful close),一种是强制关闭(hard close或abortive close)。所谓优雅关闭是指,如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。而强制关闭是指如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。 下面说一下shutdown及closesocket函数。 shutdown函数的原型是: int shutdown( SOCKET s, int how ); 该函数用于关闭TCP连接,单并不关闭socket句柄。其第二个参数可以取三个值:SD_RECEIVE,SD_SEND,SD_BOTH。 SD_RECEIVE表明关闭接收通道,在该socket上不能再接收数据,如果当前接收缓存中仍有未取出数据或者以后再有数据到达

在golang中使用socket.io

不想你离开。 提交于 2020-03-14 12:40:06
客户端试过了socket.js,感觉不先进。 再试试正宗的socket.io吧。 后端用golang改造。 main.go package main import ( "fmt" "log" "net/http" socketio "github.com/googollee/go-socket.io" ) func main() { server, err := socketio.NewServer(nil) if err != nil { log.Fatal(err) } //===========/chat1=========== server.OnEvent("/", "default notice", func(s socketio.Conn, msg string) { fmt.Println("default notice:", msg) s.Emit("default reply", "default notice reply: "+msg) }) //===========/chat1=========== server.OnEvent("/chat1", "chat1 notice", func(s socketio.Conn, msg string) { fmt.Println("chat1 notice:", msg) s.Emit("chat1 reply"

基本C语言的HELLO/HI聊天程序

风格不统一 提交于 2020-03-14 11:00:02
什么是 socket? socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。 socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。 学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。 UNIX/ Linux 中的 socket 是什么? 在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。 你也许听很多高手说过,UNIX/Linux 中的一切都是文件!那个家伙说的没错。 为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如: 通常用 0 来表示标准输入文件(stdin)

Android网络通信Socket使用

谁说我不能喝 提交于 2020-03-14 08:56:44
前一段时间做项目,涉及到TCP和UDP的使用,长期做单机的东西,一下跳到网络真的不适应,记录一下这些东西的入门级使用。 总体来说,TCP和UDP的使用流程分三步,只是TCP和UDP使用的类有所不同 图一 总体流程 具体使用的类在表一中列出,TCP是使用流传输,而UDP将数据打包发送。 TCP/IP UDP Socket Scoket DatagramSocket Outputstream DataOutputStream/PrintWirter DatagramPacket send Outputstrem.flush(); DatagramPacket.send 其中有些地方还是比较困惑的: DataOutputStream/PrintWirter有什么区别呢? 客户端-TCP使用方法 Socket socket = null; DataOutputStream out = null; //DataInputStream in = null; try { //Socket实例化 socket = new Socket(); //IP地址对象构造 InetAddress addr = Inet4Address.getByName(ip); //1)Socket链接服务器(指明端口和IP) socket.connect(new InetSocketAddress(addr, port

UDP TCP 消息边界

可紊 提交于 2020-03-14 06:16:05
先明确一个问题,如果定义了一个数据结构,大小是,比方说 32 个字节,然后 UDP 客户端连续向服务端发了两个包。现在假设这两个包都已经到达了服务器,那么服务端调用 recvfrom 来接收数据,并且缓冲区开得远大于 64,例如,开了 1024 个字节,那么,服务端的 recvfrom 函数是会一次收到两个数据包呢,还是只能收到一个。 答案是只能收到一个。 来看代码: struct.h #ifndef STRUCT_H #define STRUCT_H typedef struct _UDP_MSG { int add1; int add2; int sum; char str1[16]; char str2[16]; char cat[32]; } UDP_MSG; #endif /* STRUCT_H */ 服务器的代码: #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include "struct.h" #define MAX_LINE 1024 #define SERV_PORT 8080 int udp_serv();

C# Socket连接超时设置

好久不见. 提交于 2020-03-14 04:22:19
问题描述: 对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socket客户端: IAsyncResult.AsyncState 返回一个对象,该对象时启动异步操作的方法的最后一个参数 注: 在Socket客户端进行超时连接的设置,异步连接,设置连接处理的回调函数,以及超时的处理。 ManualResetEvent的WaitOne(TimeSpan, Boolean)起到了主要的作用。它将阻止当前线程,直到ManualResetEvent对象被Set或者超过timeout时间。上面的代码中,调用BeginConnect后通过WaitOne方法阻止当前线程,如果在timeoutMSec时间内连接成功,将在CallBackMethod回调中调用TimeoutObject.Set,解除被阻塞的连接线程并返回;否则,连接线程会在等待超时后,主动关闭连接并抛出TimeoutException。 参考资料: http://www.cnblogs.com/weidagang2046/archive/2009/02/07/1385977.html http://www.codeproject.com/Articles/31514/Implementation-of-Connecting

长连接和短链接的区别

折月煮酒 提交于 2020-03-14 03:29:09
TCP/IP TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议 UDP包括DNS、TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 什么时候用长连接,短连接? 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开

linux网络体系架构

旧巷老猫 提交于 2020-03-13 09:25:51
原创kylin_zeng: http://blog.csdn.net/kylin_fire_zeng 本文参考国嵌视频教程,再此感谢国嵌教育。 一、协议栈层次对比: 1)网络接口层把数据链路层和物理层合并在了一起,提供访问物理设备的驱动程序,对应的网络协议主要是以太网协议。 2)网络层协议管理离散的计算机间的数据传输,如IP协议为用户和远程计算机提供了信息包的传输方法,确保信息包能正确地到达目的机器。重要的网络层协议包括ARP(地址解析协议)、ICMP(Internet控制消息协议)和IP协议(网际协议)等 3)传输层的功能包括:格式化信息流、提供可靠传输。传输层包括TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议),它们是传输层中最主要的协议 4)应用层位于协议栈的顶端,它的主要任务是服务于应用,如利用FTP(文件传输协议)传输一个文件。常见的应用层协议有:HTTP,FTP,Telnet等。应用层是Linux网络设定很关键的一层,Linux服务器的配置文档主要针对应用层中的协议 二、linux网络子系统 1) 2)Linux 网络子系统的顶部是系统调用接口层。它为用户空间的应用程序提供了一种访问内核网络子系 统的方法。位于其下面的是一个协议无关层

nodejs如何实现简单的文件服务器

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-13 05:44:16
先规定简单的传输协议 文件名的长度(两个字节) 文件名(长度不定,由前两个字节决定) 文件内容的长度(8个字节) 内容 (长度不定,由前8个字节决定) 使用nodejs 实现服务端 var net = require( 'net' ) ; var fs = require( 'fs' ) ; var server = net.createServer() ; server.on( 'connection' , function (client){ console. log ( 'client connected to server。IP:%s,port%s' , client. remoteAddress , client.remotePort) ; var isFirst = true ; var fd ; var contentLength = 0 ; var dataTotalLength = 0 ; var receiveData = Buffer.alloc( 0 ) ; // data长度不可控,需要自己合并多个data直至指定的要求或者发送的socket发送FIN client.on( 'data' , function (data){ if (isFirst) { receiveData = Buffer. concat ([receiveData , data])