关于acceptex的信息
IOCP运行一段时间后,AcceptEx不返回,该怎么处理
IOCP服务端运行一段时间,客户端连不上了,但Telnet能成功,Connect能执行成功,发送数据失败,有点像是GetQueuedCompletionStatus没返回,但各个工作线程正常.AcceptEx投递时第四个参数有一个数据头大的数据。运行5-6个小时候会出现上述情况,请问题怎么回事,有什解决办法呀?
再加点日志看看,之前遇到过这种情况:

在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函数引起的,你试试看
