套接字

HttpClient 教程 (二)

强颜欢笑 提交于 2020-03-20 23:46:15
第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制。而连接操作的很多方面可以使用一些参数来控制。 2.1 连接参数 这些参数可以影响连接操作: 'http.socket.timeout':定义了套接字的毫秒级超时时间(SO_TIMEOUT),这就是等待数据,换句话说,在两个连续的数据包之间最大的闲置时间。如果超时时间是0就解释为是一个无限大的超时时间。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置,那么读取操作就不会超时(无限大的超时时间)。 'http.tcp.nodelay':决定了是否使用Nagle算法。Nagle算法视图通过最小化发送的分组数量来节省带宽。当应用程序希望降低网络延迟并提高性能时,它们可以关闭Nagle算法(也就是开启TCP_NODELAY)。数据将会更早发送,增加了带宽消耗的成文。这个参数期望得到一个java.lang.Boolean类型的值。如果这个参数没有被设置,那么TCP_NODELAY就会开启(无延迟)。 'http.socket.buffer-size':决定了内部套接字缓冲使用的大小,来缓冲数据同时接收/传输HTTP报文。这个参数期望得到一个java.lang.Integer类型的值。如果这个参数没有被设置

TCP程序开发步骤

南笙酒味 提交于 2020-03-20 23:42:27
TCP是面向连接的协议,需要通信双方首先建立一个连接。因为TCP可靠、稳定的特点,它被应用于大部分场合,但它对系统资源要求比较高。 TCP协议服务端程序的开发流程如下所示。 // 初始化Winsock库,获得协议版本 // 创建服务Socket对象 (指定协议类型,地址族信息) // 绑定Socket (将指定的IP,端口绑定给Socket) // 开始监听,并且设置监听数量. (开始监听后,客户端就可以连接成功) // 开启端口,接收连接 // 收发数据(利用建立连接的Socket对象进行通信) // 关闭Socket连接 // 终止Winsock库的调用 开发一个TCP服务端程序,在完成 初始化Winsock库 和 创建套接字(Socket)对象 两个通用步骤后,还要完成如下步骤。 (1)绑定套接字到指定IP地址和端口 无论是使用哪种协议的服务端程序,都要将服务端的IP地址和端口绑定给先前创建的套接字,客户端程序将与之进行通信。绑定套接字的函数是bind,原型如下。 int bind( SOCKET s, //套接字句柄 const struct sockaddr FAR *name, //要绑定的地址 int namelen //name所指定的地址长度 ); 第一个参数s是要绑定地址的套接字句柄,由socket函数返回。 第二个参数name是指向sockaddr结构体的指针

shutdown 和closesocket

主宰稳场 提交于 2020-03-19 09:39:40
来,咱们彻底的来讨论一下这个shutdown 和closesocket 从 函数调用上来分析(msdn):一旦完成了套接字的连接,应当将套接字关闭,并且释放其套接字句柄所占用的所有资源。真正释放一个已经打开的套接字句柄的 资源直接调用closesocket即可,但要明白closesocket的调用可能会带来负面影响,具体的影响和如何调用有关,最明显的影响是数据丢 失,因此一般都要在closesocket之前调用shutdown来关闭套接字。 shutdown:为了保证通信双方都能够收到应用程序发出的所有数据,一个合格的应用程序的做法是通知接受双发都不在发送数据!这就是所谓的“正常关 闭”套接字的方法,而这个方法就是由shutdown函数,传递给它的参数有SD_RECEIVE,SD_SEND,SD_BOTH三种,如果是 SD_RECEIVE就表示不允许再对此套接字调用接受函数。这对于协议层没有影响,另外对于tcp套接字来说,无论数据是在等候接受还是即将抵达,都要 重置连接(注意对于udp协议来说,仍然接受并排列传入的数据,因此udp套接字而言shutdown毫无意义)。如果选择SE_SEND,则表示不允许 再调用发送函数。对于tcp套接字来说,这意味着会在所有数据发送出并得到接受端确认后产生一个FIN包。如果指定SD_BOTH,答案不言而喻。 closesocket

Linux命令 - ss

你离开我真会死。 提交于 2020-03-19 08:56:23
ss命令用来显示处于活动状态的套接字信息。 (1)用法: 用法: ss [参数]      ss [参数] [过滤] (2)功能: 功能: ss是类似netstat的工具。能显示查看网络状态信息,包括TCP、UDP连接,端口。   ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。 注意: 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。 可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费生命,而用ss才是节省时间。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。 (3)选项参数 1) -t, --tcp         仅显示TCP套接字(sockets) 2) -a, --all         显示所有套接字(sockets) 3) -s, --summary      显示套接字(socket)使用概况 4) -l

SOCKET模型之重叠I/O篇(转贴)

浪子不回头ぞ 提交于 2020-03-19 02:54:07
SOCKET模型之重叠I/O篇(转贴) 本文配套的示例源码下载地址 (VC.net 2003编写的多客户端MFC代码,配有详尽注释,只是简单的显示一下客户端发来的字符,稍加改进就是个聊天室了): http://www.haha567.com/PiggyXP/OverlappedModel.rar (unix系统,千万注意链接大小写) (本文假设你已经具备用SOCKET简单模型编程的能力,如果对SOCKET一无所知请关注本系列其他文章) 目录: 1. 重叠模型的优点 2. 重叠模型的基本原理 3. 关于重叠模型的基础知识 4. 重叠模型的实现步骤 5. 多客户端情况的注意事项 一. 重叠模型的优点 1. 可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口只是支持NT系统。 2. 比起阻塞、select、WSAAsyncSelect以及WSAEventSelect等模型,重叠I/O(Overlapped I/O)模型使应用程序能达到更佳的系统性能。 因为它和这4种模型不同的是,使用重叠模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序投递了一个10KB大小的缓冲区来接收数据,且数据已经到达套接字,则该数据将直接被拷贝到投递的缓冲区。 而这4种模型种,数据到达并拷贝到单套接字接收缓冲区中,此时应用程序会被告知可以读入的容量

几种网络I/O模型

这一生的挚爱 提交于 2020-03-19 02:53:24
网络I/O模型有几种? window 下的套接字以来两种方式执行I/O操作,阻塞IO 非阻塞IO,一般默认使用的是阻塞IO 即线程会等待不会把控制权利立刻返回给程序,这就意为一个线程在某一个时候只能够去执行一个IO操作。 如果服务端想和多个客户端同时进行通信的话就要使用多线程编程,但是会增加开销,如果采用非阻塞IO程序不会等待,会立刻返回结果但是在大部分情况下返回的结果是错误的,并返回一个 WSAEWOULDBLOCK 的错误,所以程序员要不断的检测函数返回的代码以判断一个套接字何时可供读写。 为了避免麻烦 winsock 提供了不同的套接字模型对IO进行管理 select (),WSAAsyncSelect(),WSAEventSelect(),Overlapped( )。 Windows 操作系统提供了选择模型、异步选择模型、事件选择模型、重叠 I/O 模型和完成端口 共五种 I/O 模型。每一种模型均适用于一种特定的应用场景。编程人员应综合考虑到程序的扩展性和可移植性等因素,做出自己的选择 。 (1)选择模式(Select) 选择模型是 Winsock 中最常见的 I/O 模型。之所以称其为 “select 模型 ” ,是由于它的 “ 中心思想 ” 便是利用 select 函数,实现对 I/O 的管理!最初设计该模型时,主要面向的是某些使用 Unix 操作系统的计算机

三.Windows I/O模型之事件选择(WSAEventSelect )模型

隐身守侯 提交于 2020-03-19 02:52:28
1.事件选择模型:和异步选择模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。对于异步选择模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型。事件选择模型和异步选择模型最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。 2.创建事件对象:事件选择模型要求应用程序针对打算使用事件选择模型的每一个套接字,首先创建一个事件对象。创建方法是调用WSACreateEvent函数,它的定义如下:WSAEVENT WSACreateEvent(void); 3.绑定事件对象与套接字: int WSAEventSelect( SOCKET s, WSAEvent hEventObject, long lNetworkEvents//网络事件,就是异步选择中的网络事件,用法完全相同 ); 对于事件来说,他有两种类型,自动事件和人工事件。有两种状态,未触发状态和触发状态。使用WSACreateEvent函数创建的事件默认为人工事件且处于未触发状态。随着网络事件触发了与一个套接字关联在一起的事件对象,工作状态便会从未触发状态转变成触发状态。由于事件对象是在一种人工重设模式中创建的,所以在完成了一个I/O请求的处理之后,我们的应用程序需要负责将工作 状态触发状态更改未触发状态。 4.重置事件为未触发状态: BOOL

重叠I/O之事件通知

杀马特。学长 韩版系。学妹 提交于 2020-03-19 02:51:49
在 Winsock 中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于select模型、异步选择和事件选择三种。重叠模型的基本设计原理便是让应用程序使 用一个重叠的数据结构(WSAOVERLAPPED),一次投递一个或多个 Winsock I/O 请求。针对这些提交的请求,在它们完成之后,我们的应用程序会收到通知,于是 我们就可以对数据进行处理了。 要想在一个套接字上使用重叠 I/O 模型,首先必须使用 WSA_FLAG_OVERLAPPED 这个标志,创建一个套接字。例如: SOCKET s = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); 注:创建套接字的时候,假如使用的是 socket 函数,那么会默认设置 WSA_FLAG_OVERLAPPED 标志。 成功建好一个套接字,同时将其与一个本地接口绑定到一起后,便可开始进行重叠 I/O 操作,为了要使用重叠结构,我们常用的 send、recv 等收发数据的函数也都要 被 WSASend、WSARecv 替换掉了,方法是调用下述的 Winsock 函数,同时指定一个 WSAOVERLAPPED 结构(可选): WSASend() WSASendTo() WSARecv() WSARecvFrom() WSAIoctl

WinSock异步IO模型之Select

时光毁灭记忆、已成空白 提交于 2020-03-19 02:48:58
如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的。 Windows操作系统提供了五种I/O模型,分别是: ■ 选择(select); ■ 异步选择(WSAAsyncSelect); ■ 事件选择(WSAEventSelect); ■ 重叠I/O(Overlapped I/O); ■ 完成端口(Completion Port) 。 每一种模型适用于一种特定的应用场景。程序员应该对自己的应用需求非常明确, 综合考虑到程序的扩展性和可移植性等因素,作出自己的选择。 ============================================== █ 选择(select)模型是Winsock中最常见的 I/O模型。核心便是利用 select 函数,实现对 I/O的管理! 利用 select 函数来判断某Socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在Socket处于阻塞模式中时, 在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模 式中时,产生WSAEWOULDBLOCK错误。 █ select 的函数原型如下: int select( __in int nfds, __in_out fd_set* readfds, __in_out fd_set*

Select模型原理

不羁的心 提交于 2020-03-19 02:48:19
Select模型原理 利用select函数,判断套接字上是否存在数据,或者能否向一个套接字写入数据。目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入阻塞状态。 select参数和返回值意义如下: int select ( IN int nfds, //0,无意义 IN OUT fd_set* readfds, //检查可读性 IN OUT fd_set* writefds, //检查可写性 IN OUT f d_set* exceptfds, //例外数据 IN const struct timeval* timeout); //函数的返回时间 struct timeval { long tv_sec; //秒 long tv_usec; //毫秒 }; select返回fd_set中可用的套接字个数。 fd_set是一个SOCKET队列,以下宏可以对该队列进行操作: FD_CLR( s, *set) 从队列set删除句柄s; FD_ISSET( s, *set) 检查句柄s是否存在与队列set中; FD_SET( s, *set )把句柄s添加到队列set中; FD_ZERO( *set ) 把set队列初始化成空队列. Select工作流程 1:用FD_ZERO宏来初始化我们感兴趣的fd_set。