首页 > 编程知识 正文

schtasks进程开机大量出现,完成端口cancelio

时间:2023-05-03 17:13:29 阅读:62733 作者:1202

接受连接请求

服务器最常见的事情之一是接受客户端的连接请求。 套接字上使用重叠I/O接受连接的唯一API是AcceptEx ()函数。 有趣的是,常规同步接受函数accept ()的返回值是新套接字(AcceptEx ) ) )函数需要另一个套接字作为其参数之一。 这是因为AcceptEx ()是重复的操作,必须先创建套接字,然后通过参数将套接字传递给AcceptEx ) )。 以下是典型的AcceptEx ) )的伪代码的一部分。

do {

等待最后一次AcceptEx完成

-创建新套接字并将其与完成端口关联

-设置背景结构等

提出AcceptEx要求

(while ) true;

作为响应性较高的服务,必须发出足够的AcceptEx调用进行等待,以便在客户端连接请求发生时立即响应。 至于发布多少个AcceptEx才足够,取决于服务器程序期望的通信交通类型。 例如,在进入连接率高的状况时(连接时间短或发生交通量大的jzdmd时),需要等待AcceptEx当然比偶然进入的客户端连接时要多。 聪明的方法是分析交通状况,并调整AcceptEx等待的次数,而不是将交通状况固定为特定的数量。

在Windows2000上,Winsock提供了一种用于确定AcceptEx数量是否足够的机制。 这是在创建监听套接字时创建事件,并通过名为WSAEventSelect (的API注册FD_ACCEPT事件通知来将套接字与其相关联。 如果系统接收到连接请求后,系统上没有AcceptEx ()等待接受连接,则上述事件将接收信号。 通过此事件,您可以确定是否发出了足够的AcceptEx (),或者是否检测到了异常的客户请求)。 此机制不适用于Windows NT 4.0。

使用AcceptEx ()的一个主要好处是可以通过传输lpOutputBuffer参数,在一次调用中接受客户端连接请求和接受数据。 也就是说,如果在客户端发布连接时传输数据,则会创建连接,并在接收到客户端数据后立即返回AcceptEx )调用。 这可能很有用,但也可能会引起问题,因为AcceptEx ()必须在接收到所有客户端数据之前返回。 具体而言,如果在调用AcceptEx ()的同时传递lpOutputBuffer参数,则AcceptEx ) )分为两个阶段:接受客户连接并等待接收数据,而不是原子操作。 如果没有通知APP应用程序“已建立连接,正在等待客户端数据”情况的机制,则客户端可能只发出连接请求,而不发送数据。 如果服务器收到太多这种类型的连接,它将拒绝连接到更多合法客户端的请求。 这就是黑客“拒绝服务”攻击的常见手法。

为了防止这种攻击,接受连接的线程必须调用可选参数SO_CONNECT_TIME的getsockopt )函数(AcceptEx ) )来不时检查正在侦听的套接字getsockopt ()函数的选项值设置为套接字连接的时间或-1。 这意味着套接字还没有连接。 此时,WSAEventSelect ()的特性可以很好地用于这种检查。 如果发现已建立连接但很久没有收到数据的情况,则必须通过关闭作为参数提供给AcceptEx ()的套接字来终止连接。 请注意,在大多数非紧急情况下,如果套接字已传递到AcceptEx ()并开始等待,但尚未建立连接,则不应该关闭APP应用程序。 这是因为,关闭这些套接字不会在连接打开或套接字本身关闭之前清除相应内核模式的数据结构,以提高系统性能。

虽然进行AcceptEx ()调用的线程看起来与完成端口关联并处理其他I/O完成通知的线程相同,但请记住,必须尽量避免在线程中执行块类型操作。 Winsock2分层结构的一个副作用是,调用socket (或WSASocket ) (API )的高级体系结构可能很重要(),因为译者不太清楚原文的含义,所以很抱歉。 由于每个AcceptEx ()调用都需要创建新的套接字,因此建议您具有调用AcceptEx () )的专用线程,而不是参与其他I/O操作。 也可以使用此线程执行其他任务,如事件日志。

AcceptEx ()的最后一个注意事项:实现这些API不需要其他提供程序提供的Winsock2实现。 这同样适用于微软特定的其他API,如传输文件(和GetAcceptExSockAddrs )。 此外,在Windows NT和2000上,Microsoft的基础提供程序DLL )可能会添加到Windows的新版本中。通过mswsock.lib编译连接调用指向函数的指针,或通过wsa ioon

如果直接调用函数而不事先检索函数指针,也就是说,在编译时静态连接mswsock.lib并在程序中直接调用函数,则性能会受到很大影响。 AcceptEx (位于Winsock2体系结构之外,因此每次调用时都必须从WSAIoctl )获取函数指针。 为了避免这种性能损失,使用这些API的APP应用程序必须通过调用WSAIoctl ) )从底层提供程序直接获取指向函数的指针。

请参阅Figure 3插槽体系结构:

(译者)勤奋的大象sickid10001@21cn.com

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。