Click here to Skip to main content
15,914,452 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
AnswerRe: Mutiple document Templates Pin
Nibu babu thomas19-May-06 19:57
Nibu babu thomas19-May-06 19:57 
GeneralRe: Mutiple document Templates Pin
RockyJames19-May-06 20:27
RockyJames19-May-06 20:27 
JokeRe: Mutiple document Templates Pin
Nibu babu thomas19-May-06 20:39
Nibu babu thomas19-May-06 20:39 
QuestionHow To Trap esc key code for Dailog Application Pin
CodeVarma19-May-06 19:24
CodeVarma19-May-06 19:24 
AnswerRe: How To Trap esc key code for Dailog Application [modifed] Pin
_AnsHUMAN_ 19-May-06 19:26
_AnsHUMAN_ 19-May-06 19:26 
AnswerRe: How To Trap esc key code for Dailog Application Pin
Laxman Auti19-May-06 20:05
Laxman Auti19-May-06 20:05 
AnswerRe: How To Trap esc key code for Dailog Application Pin
Rajesh R Subramanian19-May-06 21:17
professionalRajesh R Subramanian19-May-06 21:17 
Questionl don't know how to use iocp? please tell me how to do? Pin
YuxiLv19-May-06 16:44
YuxiLv19-May-06 16:44 
//iocpsever.cpp
#include <winsock2.h>
#include "memorypool.h"
#include <mswsock.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")

// 但I/O操作数据
typedef struct tagPER_IO_DATA
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
char buffer[1024];
DWORD BufferLen;
int OperationType;
SOCKET Socket;
SOCKADDR_STORAGE ClientAddr;
}PER_IO_DATA, *LPPER_IO_DATA;

#define OP_READ 0
#define OP_WRITE 1
#define OP_ACCEPT 2

particle_allocator<per_io_data> g_per_io_data;
HANDLE g_hAcceptExOverEvent = NULL;

DWORD WINAPI ServerWorkerThread(LPVOID lpParam);

using namespace std;

int main(void)
{
WSADATA wsd;
SYSTEM_INFO SystemInfo;
SOCKADDR_IN InternetAddr;
SOCKET Listen;
WSAStartup(MAKEWORD(2, 2), &wsd);

HANDLE CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
NULL,
0,
0);

GetSystemInfo(&SystemInfo);

for (DWORD i = 0; i < SystemInfo.dwNumberOfProcessors; ++i)
{
HANDLE ThreadHandle;

ThreadHandle = CreateThread(NULL,
0,
ServerWorkerThread,
CompletionPort,
0,
NULL);

CloseHandle(ThreadHandle);
}

Listen = WSASocket(AF_INET,
SOCK_STREAM,
0,
NULL,
0,
WSA_FLAG_OVERLAPPED);

InternetAddr.sin_family = PF_INET;
InternetAddr.sin_port = htons(10000);
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(Listen, (SOCKADDR*)&InternetAddr, sizeof(InternetAddr));

listen(Listen, 5);

if (CreateIoCompletionPort((HANDLE) Listen, CompletionPort, (ULONG_PTR)&Listen, 0) == NULL)
{
printf("CreateIoCompletionPort failed with error %d\n", GetLastError());
return 1;
}


g_hAcceptExOverEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if(!g_hAcceptExOverEvent)
{
return 1;
}
if(WSAEventSelect(Listen, g_hAcceptExOverEvent, FD_ACCEPT) == SOCKET_ERROR)
{
return 1;
}
SetEvent(g_hAcceptExOverEvent);
BOOL b = TRUE;
while (b)
{
if(WaitForSingleObject(g_hAcceptExOverEvent, INFINITE) == WAIT_FAILED)
continue;
for(int i =0;i<10;i++)
{
PER_IO_DATA * pper_io_data = NULL;
DWORD dwAddrLen = sizeof(sockaddr_in)+16;
pper_io_data = (PER_IO_DATA *)g_per_io_data.alloc_particle();
pper_io_data ->Socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
pper_io_data->OperationType = 2;
ZeroMemory(&pper_io_data->Overlapped,sizeof(OVERLAPPED));
if(!AcceptEx(Listen,pper_io_data ->Socket,pper_io_data ->buffer,0,dwAddrLen,dwAddrLen,&pper_io_data ->BufferLen,&pper_io_data->Overlapped))
{
if(WSAGetLastError() != ERROR_IO_PENDING)
{
closesocket(pper_io_data->Socket);
g_per_io_data.free_particle((void*)pper_io_data); //归还结构体到内存池
continue;
}

}
setsockopt( pper_io_data ->Socket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, ( char* )&( Listen ), sizeof( Listen ) );

}
}
CloseHandle(g_hAcceptExOverEvent);
return 0;
}
DWORD WINAPI ServerWorkerThread(LPVOID lpParam)
{
HANDLE CompletionPort = (HANDLE)lpParam;
DWORD BytesTransferred;
LPOVERLAPPED lpOverlapped;
LPPER_IO_DATA poldPerIoData = NULL;
LPPER_IO_DATA pnewPerIoData = NULL;
DWORD RecvBytes;
DWORD Flags;
BOOL bRet = FALSE;

while (1)
{
bRet = GetQueuedCompletionStatus(CompletionPort,
&BytesTransferred,
(PULONG_PTR)
&poldPerIoData,
(LPOVERLAPPED*)
&lpOverlapped,
INFINITE);
if(!bRet)
{
continue;
}
poldPerIoData = (LPPER_IO_DATA)CONTAINING_RECORD(lpOverlapped,
PER_IO_DATA,
Overlapped);

switch (poldPerIoData->OperationType)
{
case OP_ACCEPT:
CreateIoCompletionPort(
(HANDLE)poldPerIoData->Socket,
CompletionPort,
(ULONG_PTR)0,
0);
pnewPerIoData = (LPPER_IO_DATA)g_per_io_data.alloc_particle();
if (!pnewPerIoData)
{
// Error
}
pnewPerIoData->Socket = poldPerIoData->Socket;
pnewPerIoData->OperationType = OP_READ;
ZeroMemory(&(pnewPerIoData->Overlapped), sizeof(OVERLAPPED));
Flags = 0;
pnewPerIoData->DataBuf.len = 1024;
pnewPerIoData->DataBuf.buf = pnewPerIoData->buffer;
pnewPerIoData->OperationType = 0; // read
WSARecv(pnewPerIoData->Socket,
&(pnewPerIoData->DataBuf),
1,
&RecvBytes,
&Flags,
&(poldPerIoData->Overlapped),
NULL);
g_per_io_data.free_particle((void*)poldPerIoData);
break;
case OP_READ:
cout << poldPerIoData->DataBuf.buf << endl;
pnewPerIoData = (LPPER_IO_DATA)g_per_io_data.alloc_particle();
if (!pnewPerIoData)
{
// Error
}
pnewPerIoData->Socket = poldPerIoData->Socket;
pnewPerIoData->OperationType = OP_READ;
ZeroMemory(&(pnewPerIoData->Overlapped), sizeof(OVERLAPPED));
Flags = 0;
pnewPerIoData->DataBuf.len = 1024;
pnewPerIoData->DataBuf.buf = pnewPerIoData->buffer;
pnewPerIoData->OperationType = 0; // read
WSARecv(pnewPerIoData->Socket,
&(pnewPerIoData->DataBuf),
1,
&RecvBytes,
&Flags,
&(poldPerIoData->Overlapped),
NULL);
g_per_io_data.free_particle((void*)poldPerIoData);
break;
case OP_WRITE:

break;
}
}
}
//memorypool.h
#pragma once
#include <iostream>
#include <list>#include <windows.h>

//关键区锁
class CLock
{
CRITICAL_SECTION _crisection;
public:
CLock()
{
InitializeCriticalSection( &_crisection );
}
~CLock()
{
DeleteCriticalSection( &_crisection );
}
void lock()
{
EnterCriticalSection( &_crisection );
}
void unlock()
{
LeaveCriticalSection( &_crisection );
}
};
template <class particle="">

class particle_allocator
{
enum
{
chunk_size =1024
};
typedef unsigned char byte;
struct particle_list
{
byte *_data;
particle_list *_next;
};
std::list<byte *=""> _chunks;
particle_list* _free_list;

CLock _guard;
public:
particle_allocator()
{
_free_list = 0;
_used_particle_number = 0;
_free_particle_number = 0;
}
~particle_allocator()
{
for(std::list<byte *="">::iterator iter = _chunks.begin();iter!=_chunks.end();++iter)
{
delete [] (*iter);
}

while(_free_list)
{
particle_list *temp = _free_list;
_free_list = _free_list->_next;
delete temp;
}
}
particle* alloc_particle()
{
_guard.lock();
byte *momory;
particle_list* ¤t_list = _free_list;
if(!current_list)
{
momory = new byte[chunk_size*sizeof(particle)];
_chunks.push_front(momory);
for(int i =0;i< chunk_size;i++,_free_particle_number++)
{
particle_list *newnode = new particle_list;
newnode->_data = momory + i*sizeof(particle);
newnode->_next = current_list;
current_list = newnode;
}
}
byte *redata;
particle_list *de_node = current_list;
redata = _free_list->_data;
current_list = current_list->_next;
++_used_particle_number;
--_free_particle_number;
delete de_node;
_guard.unlock();
return new(redata) particle;
}
void free_particle(void *p)
{
byte *free_block = reinterpret_cast<byte *="">(p);
_guard.lock();
particle_list* ¤t_list = _free_list;
particle_list *newnode = new particle_list;
newnode->_data = free_block;
newnode->_next = current_list;
current_list = newnode;
--_used_particle_number;
++_free_particle_number;
_guard.unlock();
}
void getallocator()
{
using namespace std;
cout << "_used_particle_number is " << _used_particle_number << " _free_particle_number is "<< _free_particle_number << endl;

}
public:
size_t _used_particle_number;
size_t _free_particle_number;
};

01 is program
AnswerRe: l don't know how to use iocp? please tell me how to do? Pin
Nibu babu thomas19-May-06 19:37
Nibu babu thomas19-May-06 19:37 
Answerl am sorry! Pin
YuxiLv20-May-06 1:16
YuxiLv20-May-06 1:16 
QuestionHow to read parllel port Pin
mbkh_8419-May-06 15:56
mbkh_8419-May-06 15:56 
AnswerRe: How to read parllel port Pin
kk.tvm19-May-06 20:52
kk.tvm19-May-06 20:52 
GeneralRe: How to read parllel port Pin
Hamid_RT20-May-06 1:02
Hamid_RT20-May-06 1:02 
QuestionRounding up to a multiple of a number Pin
Remco Hoogenboezem19-May-06 11:03
Remco Hoogenboezem19-May-06 11:03 
AnswerRe: Rounding up to a multiple of a number Pin
Nibu babu thomas19-May-06 18:50
Nibu babu thomas19-May-06 18:50 
AnswerRe: Rounding up to a multiple of a number Pin
Laxman Auti19-May-06 19:11
Laxman Auti19-May-06 19:11 
QuestionProblem with Linked List Pin
CoffeeAddict1919-May-06 9:49
CoffeeAddict1919-May-06 9:49 
AnswerRe: Problem with Linked List Pin
led mike19-May-06 11:22
led mike19-May-06 11:22 
AnswerRe: Problem with Linked List Pin
_AnsHUMAN_ 19-May-06 18:33
_AnsHUMAN_ 19-May-06 18:33 
AnswerRe: Problem with Linked List Pin
Laxman Auti19-May-06 19:45
Laxman Auti19-May-06 19:45 
Questiontabstop Pin
sandem19-May-06 9:44
sandem19-May-06 9:44 
AnswerRe: tabstop Pin
Steve Echols19-May-06 19:34
Steve Echols19-May-06 19:34 
GeneralRe: tabstop Pin
sandem22-May-06 3:45
sandem22-May-06 3:45 
QuestionCView doesn't respond to PostMessage Pin
masnu19-May-06 9:26
masnu19-May-06 9:26 
AnswerRe: CView doesn't respond to PostMessage Pin
Mauro Leggieri19-May-06 9:41
Mauro Leggieri19-May-06 9:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.