Found a bug in the source code.
I have forget to get rid of some debug code.

After fix the problem, the echo_iocp program can accept 1000 online connections 
propriety.

Test result :
Clients : 1000, Messages Per Client : 1000, Byte Per Message : 52
ExecTimes: 34.229569 seconds

client  Send    Recv
total   : 1000000       1000000
average : 29215/s       29215/s

http://spserver.googlecode.com/files/libevent-1.4.4-iocp.zip



>>>
>Integrate Windows I/O Completion Port into Libevent
>
>IOCP is true async i/o model, and libevent is event-driven i/o model.
>
>1. How to emulate event-driven recv/send ?
>It is possible to use IOCP to emulate event-driven mode. When you make read or 
>write calls, pass in a zero-byte buffer (ie, you can manage your i/o buffers 
>using event driven semantics). So if you issue a read passing in a zero-byte 
>length buffer, your will get notified when there is data to read.
>
>2. How to emulate event-driven accept ?
>The WSAEventSelect API provides an event-driven accept mechanism.
>
>3. How to integrate these two mechanism ?
>When we issue a WSARecv or WSASend, we need to pass a OVERLAPPED structure. 
>This structure has a hEvent member.
>
>http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx
>If the lpCompletionRoutine parameter is NULL, the hEvent parameter of 
>lpOverlapped is signaled when the overlapped operation completes if it 
>contains a valid event object handle. An application can use 
>WSAWaitForMultipleEvents or WSAGetOverlappedResult to wait or poll on the 
>event object.
>
>We could use one event for all WSARecv/WSASend.
>
>http://msdn.microsoft.com/en-us/library/ms686211(VS.85).aspx
>Setting an event that is already set has no effect.
>
>So it is possible to use WSAWaitForMultipleEvents to integrate IOCP and 
>WSAEventSelect.
>
>4. Solution
>
>/* objects[0] for iocp operations, object[1..63] for accept */
>HANDLE objects[64];
>struct event * accepts[64];
>
>struct win32iocp_event event1;
>event1.overlapped.hEvent = objects[0];
>WSARecv( ..., &event1.overlapped, ... );
>....
>
>struct win32iocp_event event2;
>event2.overlapped.hEvent = objects[0];
>WSASend( ..., &event2.overlapped, ... );
>...
>
>WSAEventSelect( ev1->ev_fd, objects[1], FD_ACCEPT );
>accepts[1] = ev1;
>...
>
>WSAEventSelect( ev2->ev_fd, objects[2], FD_ACCEPT );
>accepts[2] = ev2;
>...
>
>int index = WSAWaitForMultipleEvents( 64, objects, FALSE, timeout, FALSE );
>index = index - WSA_WAIT_EVENT_0;
>
>if( index > 0 ) {
> struct event * event = win32iocp_op->accepts[index];
> event_active (event, EV_READ | EV_ACCEPT, 1);
>}
>
>if( index == 0 ) {
> for( ; ; ) {
>  GetQueuedCompletionPort( ...... );
> }
>}
>
>5. Limitation
>It can only support 63 accept fds.
>
>6. Source code
>http://spserver.googlecode.com/files/libevent-1.4.4-iocp.zip
>diff file : libevent-1.4.4-iocp\libevent-iocp\diff.txt
>add file : libevent-1.4.4-iocp\WIN32-Code\win32iocp.cpp
>
>
>
>
>
>
>liusifan
>2008-06-01
>
                        


_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users

Reply via email to