网络编程——IOCP函数

来源:互联网 发布:php单例模式实例 编辑:程序博客网 时间:2024/06/06 02:47

CreateIoCompletionPort(
    _In_ HANDLE FileHandle,
    _In_opt_ HANDLE ExistingCompletionPort,
    _In_ ULONG_PTR CompletionKey,
    _In_ DWORD NumberOfConcurrentThreads
    );

        这个函数都说是端口绑定,我觉得不太准确,在网络编程的时候,会先使用这个函数创建一个完成端口,然后再次调用他,将创建的完成端口作为第二个参数传入,实现端口绑定。

       在网络编程IOCP模型中,我们会为每一个客户new一个对象,但是客户socket并非就是与你new的这个对象绑定的,他通过socket发消息,你就接受了socket,如果是一个还好,如果很多,你有如何分辨。

    而这个函数就是这个作用,告诉完成端口,那个socket对应哪个对象,第一个参数就是socket,第三个参数,就是你要绑定的对象,如果是局部的,没有用,必须是全局的。


WSARecv(
    _In_ SOCKET s,
    _In_reads_(dwBufferCount) __out_data_source(NETWORK) LPWSABUF lpBuffers,
    _In_ DWORD dwBufferCount,
    _Out_opt_ LPDWORD lpNumberOfBytesRecvd,
    _Inout_ LPDWORD lpFlags,
    _Inout_opt_ LPWSAOVERLAPPED lpOverlapped,
    _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );


BOOL
WINAPI
GetQueuedCompletionStatus(
    _In_ HANDLE CompletionPort,
    _Out_ LPDWORD lpNumberOfBytesTransferred,
    _Out_ PULONG_PTR lpCompletionKey,
    _Out_ LPOVERLAPPED * lpOverlapped,
    _In_ DWORD dwMilliseconds
    );


这两个函数一起介绍,

WSARecv这个函数,请求完成端口帮我接收recv事件触发时发过来的数据。不要被他迷惑了,前几个我就不说了,就说倒数第二个。

   在网络编程IOCP模型中,WSARecv这个函数的倒数第二个函数传入的是个缓冲区,真正的意义是,数据真正接受的地方,GetQueuedCompletionStatus这个函数从IOCP队列中接受数据,就是从WSARecv倒数第二个参数中寻找数据,然后将数据给GetQueuedCompletionStatus倒数第二个参数。

         关于别的,网上好像都能找到,就不写了






0 0
原创粉丝点击