翻译的锅 第一次接触"套接字"这个词是在大学里《计算机网络技术》这门课程,英文是"Socket",中译就是:插座、插孔。...我很难将Sokect和套接字联系到一起,我也不知道是谁翻译出来的,导致我当时一度难以理解什么是套接字。都怪我国最早那批计算机程序员都是电气工程师,套接是一个工程用词,一般来描述套结式管道。...一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。...: 80 工作流程 如果我们想通过互联网进行通信,那么由上可知,我们至少需要一对套接字,其中一个运行客户端(Client Socket),另一个运行于服务器端(Server Socket) 根据连接启动的方式以及本地套接字要连接的目标...而服务器上的聊天服务端程序一直在监听9999端口,这时候接收到小明发送过来的请求,服务端会建立一个线程和客户端进行通信
为什么一个分布在多次Softmax之后,每个值会趋于相同?
这就是为什么Node.js 使用了单线程、非阻塞的事件编程模式。...并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...以阻塞套接字为参数调用该函数发送数据。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。 3.接受连接:accept()和WSAAcept()函数。...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...当调用该函数时,套接字会自动地设置为非阻塞方式。 由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。
# socket """ 1、Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。...conn.recv(1024), encoding='utf8') print(info) # 发送消息 """ 1、发送信息必须是bytes类型 2、send:发送TCP数据,将string中的数据发送到连接的套接字...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...服务端和客户端谁先发信息都可以 2、必须是一发一收,两端不能同时发消息或收消息 """ # 发送消息 """ 1、发送信息必须是bytes类型 2、send:发送TCP数据,将string中的数据发送到连接的套接字...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...以阻塞套接字为参数调用该函数发送数据。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。 3.接受连接:accept()和WSAAcept()函数。...其最大的缺点是当希望同时处理大量套接字时,将无从下手,其扩展性很差 非阻塞IO模型 简介:非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的; ...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...当调用该函数时,套接字会自动地设置为非阻塞方式。 由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。
这就是为什么Node.js 使用了单线程、非阻塞的事件编程模式。 2....并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞模式的套接字为参数调用bind()、listen()函数时,函数会立即返回。...以阻塞套接字为参数调用该函数发送数据。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。 3.接受连接:accept()和WSAAcept()函数。...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...当调用该函数时,套接字会自动地设置为非阻塞方式。 由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。
,协议栈返回描述符讲起~~~ 协议栈结构 首先来看下协议栈的大致结构: 应用程序 代表客户端,浏览器,电子邮件等程序,这些程序发出请求委派给下一层的Socket Socket程序 解析器也是Socket...在图中还可以看到有ICMP和ARP,ICMP用于表示网络包传输过程中出现的错误,ARP是用于根据IP查询MAC地址(为什么需要MAC地址呢?...套接字 协议栈的内部会有一块记录通信对方的ip端口,通信状态,使用这块内存的应用pid的内存空间等,这个内存空间就是套接字存储的内容,这些内容叫做控制信息 协议栈需要根据套接字所存储的控制信息进行下一步的操作...pid:使用这个套接字的应用程序,由于一个应用程序会有很多个网络请求因此也有多个套接字 应用程序通过socket向协议栈发起创建套接字的请求时,协议栈会创建出一块内存并写入这个套接字刚创建完成的初始化状态...,并将代表这个套接字的描述符返回给应用程序。
安装完后在引用中会出来nnanomsg的组件,并且会多了两个文件夹x86和x64,分别的Window和Linux系统中32位和64位的nanomsg的动态库。 ?...一个消息总线上可以有多个套接字,每个套接字即是服务端可以启动监听,也是客户端可以同时连接多个其他的套接字。...连接到消息总线的任何一个套接字发送消息,消息总线上的其他套接字都能收到,一个套接字发出的消息,其他套接字有可能重复的接收到多次(这个就好比街头听到的小道消息,可能由不同的人告诉你)。...但是套接字永远不会收到自己发的消息。 上面这个情况,就好比我们关注了几个互推的公众号,有一篇不错的文章这几个公众号中相互转发,因为不你这几个都关注了,所以同一篇文章你会收到了多次。
有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了....例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。...Apache HTTPD是因特网上最流行的Web服务器,它的所有套接字就都设置了TCP_NODELAY选项,而且其性能也深受大多数用户的满意。这是为什么呢?答案就在于实现的差别之上。...对处于“连接”状态下的套接字该选项的缺省值是1,首次使用以后内核将把该选项立即复位为1(这是个一次性的选项)。 在某些情形下,发出ACK包则非常有用。...在服务器方,这两种选项都只能在侦听套接字上设置一次。所有的套接字,也就是被接受呼叫间接创建的套接字则会继承原有套接字的所有选项。
本文会围绕,从三次握手和四次挥手相关的一系列核心问题,分享如何更准确回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了 优雅回答三次握手 三次握手:服务端新建套接字,绑定地址信息后开始监听...客户端新建套接字绑定地址信息后调用connect,发送连接请求SYN,并进入SYN_SENT状态,等待服务器的确认。...这时候我们应该调整TIME_WAIT的等待时间,或者开启套接字地址重用选项 一台主机上出现大量的CLOSE_WAIT是什么原因?应该如何处理?...若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。...这些数据都可以在套接字中修改,接口:Setsockopt 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
:图片应用程序代表客户端,浏览器,电子邮件等程序,这些程序发出请求委派给下一层的SocketSocket程序解析器也是Socket的一部分用于DNS服务查询域名的IP地址,其他部分就是委派操作系统的协议栈去处理数据了操作系统操作系统的协议栈分为两部分...在图中还可以看到有ICMP和ARP,ICMP用于表示网络包传输过程中出现的错误,ARP是用于根据IP查询MAC地址(为什么需要MAC地址呢?...:使用这个套接字的应用程序,由于一个应用程序会有很多个网络请求因此也有多个套接字应用程序通过socket向协议栈发起创建套接字的请求时,协议栈会创建出一块内存并写入这个套接字刚创建完成的初始化状态,并将代表这个套接字的描述符返回给应用程序...,但是刚刚创建出来的套接字是什么信息都没有的,协议栈也因此不知道和谁通信;客户端填补信息这一步中调用socket的connect指定通信的服务器ip和端口还有使用的描述符,对应的套接字会保存这些信息,这样客户端的协议栈就可以知道通信对方的信息了...收到客户端的连接后,也会取出对应的端口号判断出使用哪个套接字,并把相关信息保存到套接字中。
当监听套接字收到新的请求时,会打开一个新的连接套接字来处理与客户端的通信。 当一个事件到达连接套接字时,工作进程迅速完成响应,并转而处理其他任何套接字新收到的事件。...1.工作进程在监听套接字和连接套接字上等待事件。 2.事件发生在套接字上,工作进程会处理这些事件。 ●监听套接字上的事件意味着:客户端开始了一局新的游戏。工作进程创建了一个新的连接套接字。...●连接套接字上的事件意味着:客户端移动了棋子。工作进程会迅速响应。 工作进程从不会在网络上停止,它时时刻刻都在等待其“对手”(客户端)做出回应。...这些新的工作进程会立即开始接受连接和处理流量(traffic)(使用新的配置)。 2.发出信号,通知旧的工作进程安静地退出。这些旧进程不会再接受新的连接了。...这个过程会导致CPU占用率和内存使用的一个小高峰,但相比于从活动连接中加载资源,这个小高峰可忽略不计。你可以在一秒内重新加载配置多次。
,后发出的数据是高地址....套接字的种类: 1、域间套接字(同一个机器内) struct sockaddr_un 2、原始套接字(网络工具) 原始套接字一般不关心传输层的东西,他一般是绕过传输层去考虑网络层和链路层,所以他一般被用来封装一些网络工具...所以我们统一是用sockaddr这个类型,然后根据他的前16位来分辨他是哪一种类型的套接字,所以在使用接口的时候要做一个强转 问题:为什么要用sockaddr这个结构,用void*不好吗?...1、首先要创建套接字 第一个参数 是套接字的域,AF_LOCAL是本地的,AF_INET是网络ipv4的 第二个参数 是套接字的类型 SOCK_STREAM是面向字节流的(TCP),SOCK_DGRAM...那么问题来了, 如果我们调用多次这个函数, 会有什么样的效果呢? 参见如下代码: 因为inet_ntoa把结果放到自己内部的一个静态存储区, 这样第二次调用时的结果会覆盖掉上一次的结果.
在众多网络编程技术中,套接字(Socket)编程无疑是核心与基石,它不仅支撑着Web服务、即时通讯、在线游戏等日常应用,还是实现分布式系统、云计算服务的关键技术之一。...在套接字编程的世界里,UDP(用户数据报协议)与TCP(传输控制协议)如同双生子,各自以其独特的优势占据着不同的应用场景。...本文旨在深入探讨Linux环境下,如何通过套接字编程技术,驾驭UDP与TCP这两种强大的网络传输协议,从零开始构建基础的网络通信能力。...,难免会多次用到一些转换,我们不妨将他们封装起来,让我们的代码变得不那么复杂,从而更容易获取我们想要的数据 #pragma once #include #include 套接字创建、绑定、监听,到数据的发送与接收,每一步都充满了挑战与收获。
family:指定协议族,比如 AF_INET表示IPv4协议,AF_INET6表示IPv6协议 type:表明套接字类型,比如 SCOK_STREAM 表示字节流套接字,SCOK_DGRAM表示数据报套接字...TCP状态转移为套接字从CLOSED状态变成LISTEN状态 规定内核应该为相应套接字排队的最大连接个数 socket创建的套接字默认是用来主动发起请求的,即用来调用connect函数,listen则是将这个套接字变成被动套接字...,用来接收请求 内核维护的监听套接字队列 image.png backlog的同一个取值根据操作系统不同,实际的数目会有差别 未完成队列:由某个客户端发出的SYN包到达了服务器,而服务器正在等待完成相应的...当客户SYN到达时,如果队列是满的,TCP会忽略这个包,使得客户端会重传 accept 用于从已完成连接队列队头返回下一个已完成连接。...connfd); //处理客户端请求完毕,关闭连接 exit(0); } Close(connfd) //由子进程处理,父进程就可以断开连接 } 复制代码 父进程中关闭了新建立的连接,为什么子进程还能处理连接请求
在计算机网络的应用层你了解多少,是否知道socket套接字有哪些?知道你的网站为什么访问慢吗?知道为什么fidder、Charles能抓到你的包吗?今天我们就来一一揭秘!...套接字(socket)是网络中不同主机上的应用进程进行双向通信的端口的抽象,网络进程通信的一端就是一个套接字,不同主机上的进程就是通过套接字发送数据报来进行通信的,如TCP协议使用主机的IP地址+端口号来作为...套接字主要有以下三种类型: 流套接字(SOCK_STREAM): 流套接字基于TCP传输协议, 主要用于面向连接的、可靠的数据传输服务,由于TCP协议的特点,使用流套接字进行通信时能够保证数据无差错、...原始套接字(SOCK_RAW): 由于流套接字和数据报套接字只能抓取TCP和UDP协议的数据,当需要处理非传输层数据包或操作系统无法处理的数据包时,就需要使用原始套接字来发送。...① 当采用抓包工具抓取 HTTP 数据包时,过程如下: 首先抓包工具会提出代理服务,客户端需要连接该代理; 客户端发出 HTTP 请求时,会经过抓包工具的代理,抓包工具将请求的原文进行展示; 抓包工具使用该原文将请求发送给服务器
接收数据同理 如何定义网络数据流的地址: 发送主机把发送缓冲区中的数据按内存地址从低到高的顺序发出 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存 也就是说先发出的数据是低地址...常见的有三种: 1.网络套接字 2.原始套接字 3.unix域间套接字 我们主要了解第一个网络套接字 网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信。...而原始套接字可以跨过传输层(TCP/IP协议)访问底层的数据。这些套接字应用场景完全不同,所以我们想用就得用三套不同的接口。...接口的设计为什么是structaddr*结构,C语言为了能够接收任意类型是void*,为什么不使用void*,而且void*不用强转 因为设计这一批接口时C语言标准还没有void* 这是OS的接口,...,IP+端口号port是套接字的形式,网络字节序列规定为大端,规定网络中的数据是大端的。
有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。...这是因为AcceptEx()是一个重叠操作,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字通过参数传给AcceptEx()。...这样可能是很有用的,但是也可能会引发问题,因为AcceptEx()必须等全部客户端数据都收到了才返回。...这是因为即使关闭了这些套接字,出于提高系统性能的考虑,在连接进入之前,或者监听套接字自身被关闭之前,相应的内核模式的数据结构也不会被干净地清除。...服务器将需要创建一个监听套接字, 把它与某个完成端口进行关联, 为每颗CPU创建一个工作线程。 再创建一个线程专门用来发出AcceptEx()。
但是通过strace命令看,cgi进程是读完了整个文件并且都通过系统接口send成功了,然后正常关闭套接字的。...也就是说,cgi把文件读完了,并且都通过send函数发给协议栈了,但是有部分内容协议栈并未发出去。...仔细分析报文,cgi进程和mongoose之间连接断开方式不对劲,由于是cgi主动关闭,应该是cgi端发送FIN,但是实际上cgi发出的是RST。...于是找驱动组同事分析,还好该同事是个大牛,通过走读协议栈代码,发现在以下情况下close套接字会发RST而不是FIN:接收缓冲区中有数据未被应用程序读取的时候,如果应用程序close套接字,协议栈会发送...这也是问题为什么概率出现的原因。
为什么要通信 通信是人的基本需求。而进程作为人的发明,自然脱离不了人的习性,也有通信需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。...管道、记名管道、套接字 演员最常使用的交互手段就是对白。对白就是一方发出声音,另一方接受声音。声音的传递则通过空气(当面或无线交谈)、线缆(有线电话)进行传递。...这样,如果需要在其他操作系统上进行通信,管道机制就多半会力不从心了。其次,管道通信需要在相关的进程间进行(无名管道),或者需要知道按名字来打开(记名管道),而这在某些时候会十分不便。...当其他(远方)的客户套接字发出一个连接请求时,我们就创建一个客户套接字。一旦客户套接字clientsocket创建成功,与客户的通信任务就交给了这个刚刚创建的客户套接字。...信号 管道和套接字虽然提供了丰富的通信语义,并且也得到了广泛应用,但它们也存在某些缺点,并且在某些时候,这两种通信机制会显得很不好使。
领取专属 10元无门槛券
手把手带您无忧上云