函数说明:ConnectEx 扩展函数是一个极其必要的API,Windows XP 及其后期版本均支持该函数。这个函数允许重叠的连接调用。以前,发动多个连接调用而又不是为每个连接使用一个线程的惟一途径,是使用多个非阻塞连接,但这样做十分麻烦,不好管理。
函数原型:BOOL
(PASCAL FAR *LPFN_CONNECTEX) (
IN SOCKET s,
IN const struct sockaddr FAR *name,
IN int namelen,
IN PVOID lpSendBuffer,
IN DWORD dwSendDataLength,
OUT LPDWORD lpdwBytesSent,
IN LPOVERLAPPED lpOverlapped
);
第1个参数是预先绑定的套接字。参数 name 表示将要连接到的远程地址。而 namelen 参数则是这个套接字地址结构长度。lpSendBuffer 参数是一个可选指针,它指向建立连接之后将要发送的存储块,而 dwSendDataLength 参数表示要发送的字节数。lpdwBytesSent 参数被更新之后用来指明,在建立连接之后如果操作立刻完成的话,成功发送的字节数。lpOverlapped 参数是和该操作关联的 OVERLAPPED 结构。这个扩展函数只可以用重叠方式调用。
就像 AcceptEX 函数一样,由于ConnectEx 是为执行而设计的,因此任何预先设定的套接字选项或属性都不会自动拷贝到连接套接字。为了达到这一目的,在建立连接之后 ,应用程序必须在套接字上调用 SO_UPDATE_CONNECT_CONTEXT。另外,就像 AcceptEx 一样,已被 TransmitFile、TransmitPackets或DisconnectEx 断开及重新使用的套接字句柄可以用作 ConnectEx 的套接字参数。
关于 ConnectEx API 没什么难题,仅有的要求是,传递到 ConnectEx 的套接字必须预选使用一个Bind调用对之进行绑定。这里也没什么特殊的标志,只是有一个重叠版本的连接,在建立连接后可以选择性地多发送一个数据块。[1]