当前位置:首页 > 英文周记 > 正文内容

关于acceptex的信息

更新时间:2026-07-18 01:16:13 周记网3年前 (2023-04-03)英文周记110

IOCP运行一段时间后,AcceptEx不返回,该怎么处理

IOCP服务端运行一段时间,客户端连不上了,但Telnet能成功,Connect能执行成功,发送数据失败,有点像是GetQueuedCompletionStatus没返回,但各个工作线程正常.AcceptEx投递时第四个参数有一个数据头大的数据。运行5-6个小时候会出现上述情况,请问题怎么回事,有什解决办法呀?

再加点日志看看,之前遇到过这种情况:

关于acceptex的信息

在Windows2003上完成AcceptEX投递后,直接返回错误,而错误处理逻辑中有个分支

没有再次投递足够的AcceptEx出去,导致客户端连不上。

根据listen的第二个参数,用telnet连接此属两个连接,如果超出数量后连接失败,则很有可能是AcceptEx没有被投递

求AcceptEx与完成端口的配合使用代码!加分!

以下是msdn上的例子:

#include stdio.h

#include "winsock2.h"

#include "mswsock.h"

void main() {

//----------------------------------------

// Declare and initialize variables

WSADATA wsaData;

HANDLE hCompPort;

LPFN_ACCEPTEX lpfnAcceptEx = NULL;

GUID GuidAcceptEx = WSAID_ACCEPTEX;

WSAOVERLAPPED olOverlap;

SOCKET ListenSocket, AcceptSocket;

sockaddr_in service;

char lpOutputBuf[1024];

int outBufLen = 1024;

DWORD dwBytes;

//----------------------------------------

// Initialize Winsock

int iResult = WSAStartup( MAKEWORD(2,2), wsaData );

if( iResult != NO_ERROR )

printf("Error at WSAStartup\n");

//----------------------------------------

// Create a handle for the completion port

hCompPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, (u_long)0, 0 );

//----------------------------------------

// Create a listening socket

ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if (ListenSocket == INVALID_SOCKET) {

printf("Error at socket(): ListenSocket\n");

WSACleanup();

return;

}

//----------------------------------------

// Associate the listening socket with the completion port

CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort, (u_long)0, 0);

//----------------------------------------

// Bind the listening socket to the local IP address

// and port 27015

hostent* thisHost;

char* ip;

u_short port;

port = 27015;

thisHost = gethostbyname("");

ip = inet_ntoa (*(struct in_addr *)*thisHost-h_addr_list);

service.sin_family = AF_INET;

service.sin_addr.s_addr = inet_addr(ip); service.sin_port = htons(port);

if ( bind( ListenSocket,(SOCKADDR*) service, sizeof(service) ) == SOCKET_ERROR ) {

printf("bind failed\n");

closesocket(ListenSocket);

return;

}

//----------------------------------------

// Start listening on the listening socket

if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {

printf("error listening\n");

}

printf("Listening on address: %s:%d\n", ip, port);

//----------------------------------------

// Load the AcceptEx function into memory using WSAIoctl.

// The WSAIoctl function is an extension of the ioctlsocket()

// function that can use overlapped I/O. The function's 3rd

// through 6th parameters are input and output buffers where

// we pass the pointer to our AcceptEx function. This is used

// so that we can call the AcceptEx function directly, rather

// than refer to the Mswsock.lib library.

WSAIoctl(ListenSocket,

SIO_GET_EXTENSION_FUNCTION_POINTER,

GuidAcceptEx,

sizeof(GuidAcceptEx),

lpfnAcceptEx,

sizeof(lpfnAcceptEx),

dwBytes,

NULL,

NULL);

//----------------------------------------

// Create an accepting socket

AcceptSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (AcceptSocket == INVALID_SOCKET) {

printf("Error creating accept socket.\n");

WSACleanup();

return;

}

//----------------------------------------

// Empty our overlapped structure and accept connections.

memset(olOverlap, 0, sizeof(olOverlap));

lpfnAcceptEx(ListenSocket,

AcceptSocket,

lpOutputBuf,

outBufLen - ((sizeof(sockaddr_in) + 16) * 2),

sizeof(sockaddr_in) + 16,

sizeof(sockaddr_in) + 16,

dwBytes,

olOverlap);

//----------------------------------------

// Associate the accept socket with the completion port

CreateIoCompletionPort((HANDLE)AcceptSocket, hCompPort, (u_long)0, 0);

//----------------------------------------

// Continue on to use send, recv, Tran**itFile(), etc.,.

...

}

下载:;displaylang=en

httpd.exe内存占用量不断增大是为啥?

一招解决apache的httpd.exe进程大量吃内存

Published

by

cktMay02因为要运行两个ASP程序,所以昨天往上把服务器换成了win+apache的形式,但是出现了个非常严重的问题,就是httpd.exe吃大量内存,时间越久吃的越多,直到内存耗尽程序崩溃.

到apache的官方网站查询,原来默认设置适合2-8G内存的服务器使用…解决办法.修改配置文件http.conf,将Threadsperchild参数设为50左右(视你的配置适量减少即可,我设成了50因为服务器配置很差),同样的,适量减少MaxRequestsPerChild的数值.保存并重启apache即可.

ThreadsPerChild的意思是系统启动时默认启动的等待线程数,用来等待处理客户的请求。在使用AcceptEx时内存增长不明显并且可以降回20M左右,可能是因为用户来了请求线程分配了一些资源,此时内存增长,但用户访问完成后,这些资源都释放了(这些资源很可能都和用户相关,没法留着下个用户使用,所以都释放了)。但禁用了AcceptEx后,由于apache每个线程需要处理网络事件,因此每个线程的资源需要就多了,并且处理完一个用户的请求后,有些资源不想释放,是可以对下个用户重用的,这样就留在了里面。由于我的线程数设了550(估计网上很多人遇到这个类似于“memory

leak”问题的可能也都设的比较大或者机器虚拟内存较小),这样当线程较多时就会出现达到最大内存的情况,而且这种现象给人的感觉就是有内存泄漏,因为初始时是20M,来一个请求后线程分配一些资源(暂时不释放的),这样可能就变成了21M,如果同时有10个人访问,可能等他们访问完后就变成了50M.

重用socket,调用DisconnectEx断开连接,然后AcceptEx可以重用这个socket,但有个问题。

那是因为你的另一端(比如说客户端),没有执行相应的closesocket函数引起的,你试试看

标签: acceptex

“关于acceptex的信息” 的相关文章

acceptex的简单介绍

acceptex的简单介绍

完成端口,到底一个CPU 建几个线程 接下来看看完成端口(Completion Ports )其实可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于是暴露 “...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。