设为首页 加入收藏

TOP

windows socket扩展函数(一)
2017-10-13 10:22:18 】 浏览:8717
Tags:windows socket 扩展 函数

1、AcceptEx()

AcceptEx()用于异步接收连接,可以取得客户程序发送的第一块数据。

 

[cpp]  view plain copy
 
  1. BOOL AcceptEx(  
  2.   _In_  SOCKET       sListenSocket,        //监听套接字句柄  
  3.   _In_  SOCKET       sAcceptSocket,        //指定一个未被使用的套接字,在这个套接字上接收新的连接
  4.   _In_  PVOID        lpOutputBuffer,       //指定一个缓冲区,用来取得在新连接上接收到的第一块数据、服务器的本地地址、客户端地址, 该参数必须指定  
  5.   _In_  DWORD        dwReceiveDataLength,  //lpOutputBuffer中数据缓冲区的大小,这一大小不包括服务器的本地地址的大小也不包括客户端的远程地址大小,                                                                                为0表示AcceptEx将不等待接收任何数据,而是尽快建立连接。
  6.   _In_  DWORD        dwLocalAddressLength, //lpOutputBuffer缓冲区中为本地地址预留的长度。必须比最大地址长度多16  
  7.   _In_  DWORD        dwRemoteAddressLength,//lpOutputBuffer缓冲区中中为远程地址预留的长度。必须比最大地址长度多16  
  8.   _Out_ LPDWORD      lpdwBytesReceived,    //接收到数据的长度,这个参数只在同步完成时有效,如果函数返回ERROR_IO_PENDING并在迟些时候完成操作,那                                                                   么这个DWORD没有意义,这时你必须获得从完成通知机制中读取操作字节数  
  9.   _In_  LPOVERLAPPED lpOverlapped          //用来处理本请求的OVERLAPPED结构,不能为NULL  
  10. );  


AcceptEx()成功完成后执行了三个操作:1、接受了新的连接;2、新连接的本地地址和远程地址都会返回;3、接收到了远程主机发来的第一块数据。

如果没有错误发生,AcceptEx函数成功完成并返回TRUE。
如果函数失败,AcceptEx返回FALSE。可以调用WSAGetLastError函数获得扩展的错误信息,如果WSAGetLastError返回ERROR_IO_PENDING,那么这次行动成功启动并仍在进行中。

如果提供了数据接收缓冲区(dwReceiveDataLength不为0),AcceptEx()投递的重叠操作直到接受到连接并且读到数据之后才会完成。可以使用getsockopt的SO_CONNECT_TIME选项来检查一个连接是否已经接受,如果它已被接受,你可以获得连接已经建立了多长时间(秒数),如果套接字未连接,getsockopt返回0xFFFFFFFF。应用程序通过检查重叠操作是否完成,并组合SO_CONNECT_TIME选项可以确定是否连接已建立了一段时间但没有收到任何数据,我们建议您通过关闭连接来终止这些连接,从而使AcceptEx()完成操作并返回一个错误状态。例如:

int seconds;
int bytes = sizeof(seconds);
int iResult = 0;
iResult = getsockopt(s, SOL_SOCKET, SO_CONNECT_TIME, (char *)&seconds, (PINT)&bytes);
if (iResult != NO_ERROR) 
{
    printf("getsockopt(SO_CONNECT_TIME) failed with error: %u\n", WSAGetLastError());
}
else 
{
    if (seconds == 0xFFFFFFFF)
        printf("Connection not established yet\n");
    else
        printf("Connection has been established %ld seconds\n", seconds);
}

较accept函数而言,程序使用AcceptEx可以更快连接到一个套接字。

AcceptEx()是一个M

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇快速排序及STL中的sort算法 下一篇当年只会C# 所以写C++就成这样了..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目