NoteDeep

创建事件数组、socket数组、重叠结构数组:

下标相同的绑定成一组(事件数组也可以直接用重叠结构中的事件)

创建重叠IO模型使用的socket:

WSASocket

投递AcceptEx:

立即完成:

投递WSARecv:立即完成(再次投递)、延迟完成(循环等待)
投递WSASend:(根据需求)立即完成、延迟完成(循环等待)
投递AcceptEx

延迟完成:

循环等待
等信号:WSAWaitForMultipleEvents

有信号:
获取重叠结构中的信息:WSAGetOverlappedResult
客户端是否退出:
接收数据:
接收信息:
发送消息:



网络头文件、网络库:

打开网络库:

校验版本:

创建socket:

SOCKET WSAAPI WSASocketA(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFOA lpProtocolInfo,
GROUP g,
DWORD dwFlags
);

作用:

创建用于异步操作的socket
WSA:windows socket async

参数:

1.地址类型:AF_INET
2.套接字类型:SOCK_STREAM
3.协议类型:IPPROTO_TCP
4.设置套接字详细的属性:默认--NULL
结构体:
WSAPROTOCOL_INFO
发送数据是否需要链接(TCP需要先链接才能发送, 而UDP不需要)
是否保证数据完整到达
如果参数3是0:(多个匹配的协议)可以设置匹配的协议
设置传输接收字节数
设置套接字的权限:会出现提示
... ...
其他保留字段:供扩展使用

5.保留:0, 一组socket组ID, 一次操作多个socket
6.指定套接字属性:
WSA_FLAG_OVERLAPPED:供重叠IO使用的socket

用于多播:
WSA_FLAG_MULTIPOINT_C_ROOT
WSA_FLAG_MULTIPOINT_C_LEAF
WSA_FLAG_MULTIPOINT_D_ROOT
WSA_FLAG_MULTIPOINT_D_LEAF

WSA_FLAG_ACCESS_SYSTEM_SECURITY:套接字设置send操作权限, send时会触发相应的操作权限提醒

WSA_FLAG_NO_HANDLE_INHERIT:
套接字不可继承, 多线程开发中, 子线程会继承父线程的socket, 子线程使用socket的方式:1.父子使用同一个(共享) 2.子线程复制一份使用(继承:释放两次)

返回值:

成功:可用的socket
失败:INVALID_SOCKET

绑定地址端口:

开始监听:

重叠IO:事件通知:

1.投递AcceptEx

BOOL AcceptEx(
SOCKET sListenSocket,
SOCKET sAcceptSocket,
PVOID lpOutputBuffer,
DWORD dwReceiveDataLength,
DWORD dwLocalAddressLength,
DWORD dwRemoteAddressLength,
LPDWORD lpdwBytesReceived,
LPOVERLAPPED lpOverlapped
);
功能:投递服务器socket, 异步并接收链接

参数:
1.服务器socket
2.客户端socket(创建socket, 将socket放在这里即可)
(和Accept区别:Accept(创建客户端socket、绑定bind)AcceptEx(仅提供绑定, 需要自己创建))
3.缓冲区指针, 接收在新链接上发送到的第一个数据, 不能设置为NULL
4.缓冲区大小, 如果取消这个缓冲区的功能, 填 0
5.为本地地址信息保留的字节数, 必须至少比使用的传输协议的最大地址长度大16字节
sizeof(struct sockaddr_in) + 16 // 本地存储的地址信息内存大小
6.为远程地址信息保留的字节数, 必须至少比使用的传输协议的最大地址长度大16字节, 不能为 0
sizeof(struct sockaddr_in) + 16 // 临时存储的地址信息内存大小
7.配合参数3和参数4, AcceptEx立即执行时, 第一次发来的字节数
如果不是立即完成, 不会返回收到字节数
可以填写NULL, 或DWORD变量的地址
8.服务器重叠结构的地址

返回值
TRUE:立即完成返回
FALSE:
错误码:ERROR_IO_PENDING:异步等待
其他错误码:出错

延迟完成的处理

2.投递WSARecv

int WSAAPI WSARecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
作用:投递异步接收信息

参数
1.客户端socket
2.接收到的信息存储结构体指针
typedef struct _WSABUF {
ULONG len;
CHAR *buf;
} WSABUF, *LPWSABUF;
成员1:接收缓冲区长度
成员2:接收缓冲区地址
3.有几个结构体, 可以接收多个
4.成功接收到的字节数
参数6不为NULL, 参数4可以为NULL
5.指向修改WSARecv函数调用行为的标志的指针, 和recv参数5一样
MSG_PEEK:将协议缓冲区中的数据复制出来, 但是不删除
MSG_OOB:带外数据
MSG_PUSH_IMMEDIATE:通知传送尽快完成, 可能会舍弃造成数据丢失, 不能用于大文件的发送, 聊天没问题(会减少一定的延迟)
MSG_WAITALL:直到缓冲区装满, 才会产生信号
MSG_PARTIAL:(传出的参数)表示此次接收的数据是一部分, 接下来将接收下一部分
6.重叠结构
7.回调函数:用在完成例程中



返回值
立即发生:返回 0
错误码:
ERROR_IO_PENDING:延迟处理(WSA_IO_PENDING)

3.投递WSASend

int WSAAPI WSASend(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
作用:投递异步发送消息

参数:基本和WSARecv相同
5.指示函数行为

等待信号:

DWORD WSAAPI WSAWaitForMultipleEvents(
DWORD cEvents,
const WSAEVENT *lphEvents,
BOOL fWaitAll,
DWORD dwTimeout,
BOOL fAlertable
);

参数
1.事件个数
2.事件数组
3.事件等待方式:
TRUE:所有事件都产生信号才返回
FALSE:任何一个事件产生信号立即返回
返回值 - WSA_WAIT_EVENT_0表示事件的对象索引
如果调用期间多个事件发生信号, 返回下标最小的
4.超时间隔:
毫秒, 如果没有一个有信号所等待的时间, 超时返回 WSA_WAIT_TIMEOUT
0:立即返回, 不等待
WSA_INFINITE:等待直到事件的发生
5.TRUE:重叠I/O中的完成例程使用
FALSE:事件select模型

返回值
数组下标的运算值:参数3为需要设置为false-->返回值 - WSA_WAAIT_EVENT_0 == 数组下标
WSA_WAIT_IO_COMPLETION:重叠IO的返回值
WSA_WAIT_TIMEOUT:超时, 没有事件有信号, continue
调用失败:WSA_WAIT_FAILED

等到信号:

获取函数
BOOL WSAAPI WSAGetOverlappedResult(
SOCKET s,
LPWSAOVERLAPPED lpOverlapped,
LPDWORD lpcbTransfer,
BOOL fWait,
LPDWORD lpdwFlags
);
功能
对应socket上的对应的重叠结构的具体情况
调用之后需要将事件置为无事件

参数
1.有信号的socket
2.对应的重叠结构
3.发送或接收的实际字节数:
0:表示客户端下线
4.重叠IO事件完成通知时选择TRUE
5.装WSARecv的参数5, 不能是NULL

返回值
TRUE:成功
FALSE:失败, WSAGetLastError, 10054是客户端强制退出












评论列表

    创建事件数组、socket数组、重叠结构数组:
    创建重叠IO模型使用的socket:
    投递AcceptEx:
    网络头文件、网络库:
    打开网络库:
    校验版本:
    创建socket:
    绑定地址端口:
    开始监听:
    重叠IO:事件通知: