首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)

关于服务端和客户端我们从Socket库调用上查看两者差别:客户端的数据收发需要 经过下面 4 个阶段。...接下来协议栈会给等待连接的套接字复制一个副本, 然后将连接对象等控制信息写入新的套接字中,为什么这里要创建副本简单解释一下,因为如果直接使用原有的套接字连接,那么当新的客户端请求过来,就必须要再次创建新的套接字然后再次进行连接...创建套接字除了复制套接字这个特点外,还有一个是端口号的使用,因为一个套接字需要对应一个端口号,但是需要注意新创建的套接字副本必须和原来的等待连接的套接字具有相同的端口号,原因是防止类似客户端本来想要连接...80 端口上的套接字, 结果从另一个端口号返回了包这样的情况。...为什么还要使用描述符呢?这里回顾一下描述符的内容,描述符指的是在创建套接字之后,服务端需要返回给客户端一条标识信息,目的是告知客户端自己是谁,协议栈也需要返回描述符用于标识是哪一个套接字在进行传数据。

66110

Redis与Reactor模式

但对于accept客户端连接、处理客户端请求、返回命令结果等等这些,Redis是使用主进程及主线程来完成的。我们可能会惊讶Redis在使用单进程及单线程来处理请求为什么会如此高效?...,对这样的套接字的读操作将返回0(也就是返回EOF); 该套接字是一个监听套接字且已完成的连接数不为0; 该套接字有错误待处理,对这样的套接字的读操作将返回-1。...返回之后,该套接字连接成功或失败; 该套接字有错误待处理,对这样的套接字的写操作将返回-1。...pollfd结构的数组,调用返回时结果信息也存放在这个数组里面。...select问题3比较容易解决,只要系统调用返回的是实际发生相应事件的fd集合,我们便不需要扫描全量的fd集合。 对于select的问题4,我们为什么需要每次调用都传递全量的fd呢?

4.7K52
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从零开始的C++网络编程

    服务端收到ACK包,成功建立连接,accept函数返回出客户端套接字。...套接字描述符本质上类似于文件描述符,文件通过文件描述符供程序进行读写,而套接字描述符本质上也是提供给程序可以对其缓存区进行读写,程序在其写缓存区写入数据,写缓存区的数据通过网络通信发送至另一端的相同套接字的读缓存区...,另一端的程序使用相同的套接字在其读缓存区上读取数据,这样便完成了一次网络数据传输。...地址的表达格式的长度 对于返回结果而言 若转换成功则返回指向返回结果的指针 若出错则返回NULL 返回值 若成功则返回0,否则返回-1并置相应的errno。...总结 本文通过一个简单的C++客户端/服务器例子讲述了C++网络编程的基础以及一些关于压力测试的入门知识。读者可以借此对C++网络编程有一个大体的认识,也算是从零开始的C++网络编程的一个入门吧。

    8K1814

    高山仰之可极,谈半同步半异步网络并发模型

    一图胜千言: 关于套接字,相信大家都不陌生,我们知道套接字有两种:服务端套接字(被动套接字)和客户端套接字。套接字在listen调用之后,会变成被动套接字,等待客户端的连接(connect)。...其实socket的本质是一种特殊的fd(文件描述符)。 为了表达简洁清晰,用socket指代服务端套接字,fd表示连接之后的客户端套接字。...关于工作线程消费队列数据的方式,和一般的『队列』模型相同,即可分为『推』和『拉』两种模型。通常HSHA为推模型,即若队列尚无数据,则工作线程阻塞休眠,等待数据产生。...殊不知vector在进行realloc,即重新分配内存的时候,之前的返回给你的迭代器会失效! 请记住C++不是银弹,STL更不是! 3....当然poll也并不总是由于select的。因为这两货还有一个操作就是每次select/poll的时候会将监视的fd集合从用户态拷贝到内核态。

    48140

    accept()返回的套接字绑定哪个端口 新旧套接字的联系

    :非负描述字——成功, -1——失败 accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。...参数addr  这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。...这时我执行了只关闭监听端口的语句,结果却发现监听端口和已建立的连接仍然存在。我都已经关闭了监听套接字,为什么客户端还可以继续往监听端口发信息?这到底是因为什么呢?新套接字和监听套接字有什么关系呢?...:非负描述字——成功, -1——失败 accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。...这时我执行了只关闭监听端口的语句,结果却发现监听端口和已建立的连接仍然存在。我都已经关闭了监听套接字,为什么客户端还可以继续往监听端口发信息?这到底是因为什么呢?新套接字和监听套接字有什么关系呢?

    3.9K30

    30.1. 企业级开发进阶2.1:TCP编程

    断开连接的四次挥手操作 从上面的操作过程我们可以发现一个规律,服务器端总是处于等待状态,客户端会主动发起和服务器的连接,通过三次握手建立可靠的连接并进行数据的传输。...,使用socket.SOCK_STREAM表示使用流协议(TCP) 返回值:一旦创建成功,返回一个套接字对象,姑且命名为sc ---- bind():用于将套接字和主机IP以及端口号Port进行绑定,就是上面例图中将网线插到电脑上...recv():用于接收远程套接字对象发送的数据 返回值:远程套接字发送的数据 ---- sendall(data):用于向远程主机发送数据 参数data:用于发送的数据 ---- close():...---- 2.2 TCP服务端程序编写 服务端程序开发,首先创建服务端程序的套接字对象,将套接字对象跟服务器IP地址和端口进行绑定;其次开始设置启动监听,等待客户端的连接;如果客户端一旦连接进来,就可以和客户端之间进行数据的收发操作...服务端接收到客户端的连接 2.3 TCP客户端程序编写 相对于服务端编程,客户端编程就变得比较简单了,我们通过 创建客户端套接字对象,通过调用套接字对象的connect(ip, port)方法连接指定

    36810

    完成端口与线程池的关系_端口触发

    大家好,又见面了,我是你们的朋友全栈君。 关于IOCP网上到处都是资料,说的也很详细。我在这里就不再多说了,这只是本人在学习IOCP时的笔记,和配合AcceptEx写的一个极小的服务端程序。...2.在GetQueuedCompletionStatus中,没有错误,但总是返回读取的字数为0。I/O重叠结构中也收不到任何字符。...在学习IOCP时,看到一位大神写的文章,他用客户端开了3W个线程同时连接服务端和发送数据,我好奇就也开了3W个线程去同时连接服务端,结果很多都printf连接失败的信息!...如果大量套接字并发接入,难免有的套接字不能及时创建和接收。 AcceptEx则是事先创建好套接字,坐等客户端的连接就行了。...为了验证IOCP是否有那么强的能力,我的客户端没有做成连接到服务端一个套接字,再创建一个线程,传递套接字到线程的方式。

    94130

    腾讯C++后台开发面试笔试知识点参考笔记

    udp原理与套接字 udp服务端: sockListener=socket(AF_INET,SOCK_DGRAM,0) bind(sockListener,(struct...在一个已连接 UDP 套接字上,由内核为输入操作返回的数据报只有那些来自 connect 函数所指定的协议地址的数据报。...目的地为这个已连接 UDP 套接字的本地协议地址,发源地不是该套接字早先 connect 到的协议地址的数据报,不会投递到该套接字。...这样已连接 UDP 套接字只能与一个对端交换数据报; 由已连接 UDP 套接字引发的异步错误会返回给它们所在的进程,而未连接 UDP 套接字不会接收任何异步错误; tcp套接字 服务端: listenfd...a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。

    1K10

    Netty实战专栏 | Java网络编程深入解析

    2.2端口和套接字 1.关于端口 在计算机网络中,端口(Port)是指一种标识网络服务的机制,是用于标识不同网络应用程序的数字。每个TCP或UDP连接都需要一个端口来确定要发送或接收的数据类型。...2.关于Socket套接字 Socket(套接字) 是计算机网络中用于实现网络通信的一种编程接口。它提供了一组函数和方法,使得应用程序能够通过网络进行数据的发送和接收。...为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求 。...3.连接确认 所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述 发送给客户端。...最后,本地域名服务器向权威域名服务器发送查询请求,权威域名服务器会返回该域名对应的IP地址给本地域名服务器,然后本地域名服务器将结果缓存并返回给操作系统。

    69210

    TCP四次挥手原因

    在代码层面来理解: 当我们服务端的read函数返回0,说明客户端的数据已经到结尾了,然后客户端半关闭事件喽 当服务端close返回的时候,说明4次挥手成功,连接关闭喽。...因为一个 套接字(左右方框均可看成一个套接字) 中有两个缓冲区,一个读缓冲区,一个写缓冲区 当一个套接字处于半关闭状态时,也就代表,关闭了写缓冲区,读缓冲区依然开启。...相同概念,所以客户端和服务端各自都来关一次,就4次挥手 接下来两次挥手 综合起来就是: 这里大家是不是还会有一个小疑问?半关闭后的客户端为什么还能发送ACK呢?...半关闭并非关 套接字,而是关缓冲区!!!...也就是关掉内核的写缓冲区,也就是客户端不会再向服务端写数据了,但是客户端与服务端之间的连接还在的呀,仔细看这图,所以可以返回ACK应答的 总结如下: 三次握手: 主动放松连接请求端,发送SYN标志位,

    31610

    又被百度捞起来了,能赢吗?

    之前有同学反馈说,有没有 C++ 服务器开发的面试呀? 还真有,最近有 C++ 同学被百度从简历池捞起来面试了,目前经历了一二面,我把比较通用的面试问题抽离出来跟大家分享一波。...答:1 为什么呢? 答:我就说了C++是固定地址的,如果是0的话,调用的时候会有地址冲突。 说到这个sizeof,你觉得它是函数吗? 答:它是运算符 运算符的话,一般在什么时候给它定好?...答:我认为是的 计算机网络 如果要实现一个TCP服务器要哪些(套接字)接口?...答:(一开始没有听到套接字三个字,给我干懵了,不知道是要什么接口,就直接答了不了解;然后面试官说你没用过Socket编程吗,我才反应过来时套接字)先是用bind函数绑定一个套接字,然后进行Listen监听...但是上限值是内核参数 somaxconn 的大小,也就说 accpet 队列长度 = min(backlog, somaxconn)。 怎样设置一个套接字为非阻塞模式?

    10110

    Linux:网络编程套接字及UDP

    所以我们统一是用sockaddr这个类型,然后根据他的前16位来分辨他是哪一种类型的套接字,所以在使用接口的时候要做一个强转  问题:为什么要用sockaddr这个结构,用void*不好吗?...是面向数据报的(UDP) 第三个参数  是协议类型  目前默认为0 返回值是如果创建成功返回文件描述符 (相当于是一个可以写入网络的一个文件),如果创建失败返回-1 2、绑定套接字 第一个参数是 文件描述符...第二个参数是  套接字的类型  类型是sockaddr*  第三个参数是  套接字类型的长度 类型是socklen_t 返回值:如果成功了就返回0,如果绑定失败就返回-1  问题:输入型参数的sockaddr...实例: 2.1.7 关于inet_ntoa       inet_ntoa这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip的结果...., 这个函数由调用者提供一个缓冲区保存结果, 可以规避线程安全问 题; 2.2 UDP客户端  1、创建客户端的套接字   问题:client要bind吗??

    11310

    python socket编程详细介绍

    s.connect_ex(adddress)功能与connect(address)相同,但是成功返回0,失败返回errno的值。...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。s.recvfrom(bufsize[.flag]) 接受UDP套接字的数据。...将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。s.close()关闭套接字。s.getpeername()返回连接套接字的远程地址。...返回值通常是元组(ipaddr,port)。s.getsockname()返回套接字自己的地址。...s.makefile()创建一个与该套接字相关连的文件 3、socket编程思路 TCP服务端: 1 创建套接字,绑定套接字到本地IP与端口    # socket.socket(socket.AF_INET

    86910

    C++ Qt开发:QTcpSocket网络通信组件

    QHostAddress peerAddress() const 返回与套接字连接的远程主机的地址。 quint16 peerPort() const 返回与套接字连接的远程主机的端口。...qint64 write(const char *data, qint64 maxSize) 将数据写入套接字,返回实际写入的字节数。...qint64 read(char *data, qint64 maxSize) 从套接字读取数据,返回实际读取的字节数。 void readyRead() 当套接字有可供读取的新数据时发出信号。...1.1 通信的流程 1.1.1 服务端流程 在使用TCP通信时同样需要导入Qt+=network模块,并在头文件中引入QTcpServer和QTcpSocket两个模块,当有了模块的支持,接着就是侦听套接字...它的原型如下: QTcpSocket *QTcpServer::nextPendingConnection(); 函数返回一个指向新连接套接字的指针。如果没有已接受的连接,则返回 nullptr。

    45810

    C#网络编程(基本概念和操作) - Part.1

    本文是该系列第一篇,主要讲述了基于套接字(Socket)进行网络编程的基本概念,其中包括TCP协议、套接字、聊天程序的三种开发模式,以及两个基本操作:侦听端口、连接远程服务端;第二篇讲述了一个简单的范例...编程中与TCP相关的最重要的一个概念就是套接字。...可以看出两个程序之间的对话是通过套接字这个出入口来完成的,实际上套接字包含的最重要的也就是两个信息:连接至远程的本地的端口信息(本机地址和端口号),连接到的远程的端口信息(远程地址和端口号)。...在.NET中,尽管我们可以直接对套接字编程,但是.NET提供了两个类将对套接字的编程进行了一个封装,使我们的使用能够更加方便,这两个类是TcpClient和TcpListener,它与套接字的关系如下:...每创建一个新的TcpClient便相当于创建了一个新的套接字Socket去与服务端通信,.Net会自动为这个套接字分配一个端口号,上面说过,TcpClient类不过是对Socket进行了一个包装。

    1.4K51

    Java基础篇 |网络编程深入解析

    2.2端口和套接字 1.关于端口 在计算机网络中,端口(Port)是指一种标识网络服务的机制,是用于标识不同网络应用程序的数字。每个TCP或UDP连接都需要一个端口来确定要发送或接收的数据类型。...2.关于Socket套接字 Socket(套接字) 是计算机网络中用于实现网络通信的一种编程接口。它提供了一组函数和方法,使得应用程序能够通过网络进行数据的发送和接收。...为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求 。...3.连接确认 所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述 发送给客户端。...最后,本地域名服务器向权威域名服务器发送查询请求,权威域名服务器会返回该域名对应的IP地址给本地域名服务器,然后本地域名服务器将结果缓存并返回给操作系统。

    1.2K30

    网络编程-一个简单的echo程序(1)

    关于字节序,本文不展开介绍,可以参考《谈一谈字节序的问题》,如何判断当前机器的字节序,也是面试中经常到的题目。...通过socket函数指定了本次网络通信的协议族,套接字类型,调用成功后,会返回一个非负的套接字描述符,否则返回-1,具体失败原因,被存放于全局变量errno。...accept--接受来自客户端的连接 accept函数在服务端调用,它用于接受来自客户端的连接,从已完成连接队列返回一个已完成连接。...另外需要注意的是,它的返回值是一个非负的套接字描述符,这个套接字描述符是已连接套接字描述符,而其参数sockfd是监听套接字描述符。...为什么客户端连接到服务端后,服务端有一个处于LISTEN状态,还有一个处于ESTABLISHED状态吗? 通过已连接套接字描述符就可以对其进行数据的读写了。

    1K40

    C++ Qt开发:QTcpSocket网络通信组件

    QHostAddress peerAddress() const 返回与套接字连接的远程主机的地址。...1.1 通信的流程1.1.1 服务端流程在使用TCP通信时同样需要导入Qt+=network模块,并在头文件中引入QTcpServer和QTcpSocket两个模块,当有了模块的支持,接着就是侦听套接字...它的原型如下:QTcpSocket *QTcpServer::nextPendingConnection();函数返回一个指向新连接套接字的指针。如果没有已接受的连接,则返回 nullptr。...当有了套接字以后,就可以通过QTcpServer指针判断对应的套接字状态,一般套接字的状态被定义在QAbstractSocket类内。...,并绑定其他四个槽函数,这里的槽函数功能各不相同,将其对应的信号绑定到对应槽函数上即可;// 初始化信号槽函数void MainWindow::onNewConnection(){ // 创建新套接字

    61612

    完整的一次 HTTP 请求响应过程(一)

    接着,应用层决定创建一个『TCP 套接字』,然后将这个请求动作封装成一个 Http 数据报并推入套接字中。...套接字分为两种类型,『TCP 套接字』和『UDP 套接字』,应用层同时可能会有几十个数据报的发出,而运输层也会收到所有的响应报文,那么它该如何区分这些报文到底是谁的响应报文呢?...而套接字就是用于区分各个应用层应用的,往往由端口号和 IP 地址进行标识,运输层只要查看响应报文的源端口号和 IP 地址就能够知道该将报文推送给哪个套接字了。...当一个应用层数据报被推动进套接字之后,应用层的所有工作也算是全部完成了,关于后续报文的去向,它已经不用管了。...其实路由器不仅给你返回了 IP 地址,还会告诉你一个 DNS 服务器地址,这个就是你的本地 DNS 服务器地址,也就是说,你的所有域名解析请求只要告诉它就行了,它会帮你查并返回结果给你的。

    59220
    领券