您的位置:首页 > 理论基础 > 计算机网络

网络编程——IOCP函数

2016-04-21 16:03 302 查看
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倒数第二个参数。

关于别的,网上好像都能找到,就不写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: