青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

AcceptEx Function[MSDN 做個記錄]

AcceptEx Function

The AcceptEx function accepts a new connection, returns the local and remote address, and receives the first block of data sent by the client application.

Note  This function is a Microsoft-specific extension to the Windows Sockets specification.


引用
BOOL AcceptEx(
  __in   SOCKET sListenSocket,
  __in   SOCKET sAcceptSocket,
  __in   PVOID lpOutputBuffer,
  __in   DWORD dwReceiveDataLength,
  __in   DWORD dwLocalAddressLength,
  __in   DWORD dwRemoteAddressLength,
  __out  LPDWORD lpdwBytesReceived,
  __in   LPOVERLAPPED lpOverlapped
);

Parameters
sListenSocket
A descriptor identifying a socket that has already been called with the listen function. A server application waits for attempts to connect on this socket.

sAcceptSocket
A descriptor identifying a socket on which to accept an incoming connection. This socket must not be bound or connected.

lpOutputBuffer
A pointer to a buffer that receives the first block of data sent on a new connection, the local address of the server, and the remote address of the client. The receive data is written to the first part of the buffer starting at offset zero, while the addresses are written to the latter part of the buffer. This parameter must be specified.

dwReceiveDataLength
The number of bytes in lpOutputBuffer that will be used for actual receive data at the beginning of the buffer. This size should not include the size of the local address of the server, nor the remote address of the client; they are appended to the output buffer. If dwReceiveDataLength is zero, accepting the connection will not result in a receive operation. Instead, AcceptEx completes as soon as a connection arrives, without waiting for any data.

dwLocalAddressLength
The number of bytes reserved for the local address information. This value must be at least 16 bytes more than the maximum address length for the transport protocol in use.

dwRemoteAddressLength
The number of bytes reserved for the remote address information. This value must be at least 16 bytes more than the maximum address length for the transport protocol in use. Cannot be zero.

lpdwBytesReceived
A pointer to a DWORD that receives the count of bytes received. This parameter is set only if the operation completes synchronously. If it returns ERROR_IO_PENDING and is completed later, then this DWORD is never set and you must obtain the number of bytes read from the completion notification mechanism.

lpOverlapped
An OVERLAPPED structure that is used to process the request. This parameter must be specified; it cannot be NULL.

Return Value
If no error occurs, the AcceptEx function completed successfully and a value of TRUE is returned.

If the function fails, AcceptEx returns FALSE. The WSAGetLastError function can then be called to return extended error information. If WSAGetLastError returns ERROR_IO_PENDING, then the operation was successfully initiated and is still in progress. If the error is WSAECONNRESET, an incoming connection was indicated, but was subsequently terminated by the remote peer prior to accepting the call.

Remarks


The AcceptEx function combines several socket functions into a single API/kernel transition. The AcceptEx function, when successful, performs three tasks:

A new connection is accepted.
Both the local and remote addresses for the connection are returned.
The first block of data sent by the remote is received.

Note  The function pointer for the AcceptEx function must be obtained at run time by making a call to the WSAIoctl function with the SIO_GET_EXTENSION_FUNCTION_POINTER opcode specified. The input buffer passed to the WSAIoctl function must contain WSAID_ACCEPTEX, a globally unique identifier (GUID) whose value identifies the AcceptEx extension function. On success, the output returned by the WSAIoctl function contains a pointer to the AcceptEx function. The WSAID_ACCEPTEX GUID is defined in the Mswsock.h header file.

A program can make a connection to a socket more quickly using AcceptEx instead of the accept function.

A single output buffer receives the data, the local socket address (the server), and the remote socket address (the client).

Using a single buffer improves performance. When using AcceptEx, the GetAcceptExSockaddrs function must be called to parse the buffer into its three distinct parts (data, local socket address, and remote socket address). On Windows XP and later, once the AcceptEx function completes and the SO_UPDATE_ACCEPT_CONTEXT option is set on the accepted socket, the local address associated with the accepted socket can also be retrieved using the getsockname function. Likewise, the remote address associated with the accepted socket can be retrieved using the getpeername function.

The buffer size for the local and remote address must be 16 bytes more than the size of the sockaddr structure for the transport protocol in use because the addresses are written in an internal format. For example, the size of a sockaddr_in (the address structure for TCP/IP) is 16 bytes. Therefore, a buffer size of at least 32 bytes must be specified for the local and remote addresses.

The AcceptEx function uses overlapped I/O, unlike the accept function. If your application uses AcceptEx, it can service a large number of clients with a relatively small number of threads. As with all overlapped Windows functions, either Windows events or completion ports can be used as a completion notification mechanism.



Another key difference between the AcceptEx function and the accept function is that AcceptEx requires the caller to already have two sockets:

One that specifies the socket on which to listen.
One that specifies the socket on which to accept the connection.
The sAcceptSocket parameter must be an open socket that is neither bound nor connected.

The lpNumberOfBytesTransferred parameter of the GetQueuedCompletionStatus function or the GetOverlappedResult function indicates the number of bytes received in the request.



When this operation is successfully completed, sAcceptSocket can be passed, but to the following functions only:

ReadFile
WriteFile
send
WSASend
recv
WSARecv
TransmitFile
closesocket
setsockopt (only for SO_UPDATE_ACCEPT_CONTEXT)
Note  If the TransmitFile function is called with both the TF_DISCONNECT and TF_REUSE_SOCKET flags, the specified socket has been returned to a state in which it is neither bound nor connected. The socket handle can then be passed to the AcceptEx function in the sAcceptSocket parameter, but the socket cannot be passed to the ConnectEx function.

When the AcceptEx function returns, the socket sAcceptSocket is in the default state for a connected socket. The socket sAcceptSocket does not inherit the properties of the socket associated with sListenSocket parameter until SO_UPDATE_ACCEPT_CONTEXT is set on the socket. Use the setsockopt function to set the SO_UPDATE_ACCEPT_CONTEXT option, specifying sAcceptSocket as the socket handle and sListenSocket as the option value.


For example:
  1.  err = setsockopt( sAcceptSocket,    
  2.     SOL_SOCKET,    
  3.     SO_UPDATE_ACCEPT_CONTEXT,    
  4.     (char *)&sListenSocket,    
  5.     sizeof(sListenSocket) );   

If a receive buffer is provided, the overlapped operation will not complete until a connection is accepted and data is read. Use the getsockopt function with the SO_CONNECT_TIME option to check whether a connection has been accepted. If it has been accepted, you can determine how long the connection has been established. The return value is the number of seconds that the socket has been connected. If the socket is not connected, the getsockopt returns 0xFFFFFFFF. Applications that check whether the overlapped operation has completed, in combination with the SO_CONNECT_TIME option, can determine that a connection has been accepted but no data has been received. Scrutinizing a connection in this manner enables an application to determine whether connections that have been established for a while have received no data. It is recommended such connections be terminated by closing the accepted socket, which forces the AcceptEx function call to complete with an error.


For example:

  1.  INT seconds;   
  2. INT bytes = sizeof(seconds);   
  3. err = getsockopt( sAcceptSocket, SOL_SOCKET, SO_CONNECT_TIME,   
  4.                       (char *)&seconds, (PINT)&bytes );   
  5. if ( err != NO_ERROR ) {   
  6.     printf( "getsockopt(SO_CONNECT_TIME) failed: %ld\n", WSAGetLastError( ) );   
  7.     exit(1);   
  8. }   

Note   All I/O initiated by a given thread is canceled when that thread exits. For overlapped sockets, pending asynchronous operations can fail if the thread is closed before the operations complete. See ExitThread for more information.

Example Code

The following example uses the AcceptEx function using overlapped I/O and completion ports.

  1.  #include <stdio.h>   
  2. #include "winsock2.h"   
  3. #include "mswsock.h"   
  4.   
  5. void main() {   
  6.   //----------------------------------------   
  7.   // Declare and initialize variables   
  8.   WSADATA wsaData;   
  9.   HANDLE hCompPort;   
  10.   LPFN_ACCEPTEX lpfnAcceptEx = NULL;   
  11.   GUID GuidAcceptEx = WSAID_ACCEPTEX;   
  12.   WSAOVERLAPPED olOverlap;   
  13.      
  14.   SOCKET ListenSocket, AcceptSocket;   
  15.   sockaddr_in service;   
  16.   char lpOutputBuf[1024];   
  17.   int outBufLen = 1024;   
  18.   DWORD dwBytes;   
  19.   
  20.   //----------------------------------------   
  21.   // Initialize Winsock   
  22.   int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );   
  23.   if( iResult != NO_ERROR )   
  24.     printf("Error at WSAStartup\n");   
  25.   
  26.   //----------------------------------------   
  27.   // Create a handle for the completion port   
  28.   hCompPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, (u_long)0, 0 );   
  29.   
  30.   //----------------------------------------   
  31.   // Create a listening socket   
  32.   ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );   
  33.   if (ListenSocket == INVALID_SOCKET) {   
  34.     printf("Error at socket(): ListenSocket\n");   
  35.     WSACleanup();   
  36.     return;   
  37.   }   
  38.   
  39.   //----------------------------------------   
  40.   // Associate the listening socket with the completion port   
  41.   CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort, (u_long)0, 0);   
  42.   
  43.   //----------------------------------------   
  44.   // Bind the listening socket to the local IP address   
  45.   // and port 27015   
  46.   hostent* thisHost;   
  47.   char* ip;   
  48.   u_short port;   
  49.   port = 27015;   
  50.   thisHost = gethostbyname("");   
  51.   ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);   
  52.   
  53.   service.sin_family = AF_INET;   
  54.   service.sin_addr.s_addr = inet_addr(ip);  service.sin_port = htons(port);   
  55.   
  56.   if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) )  == SOCKET_ERROR ) {   
  57.     printf("bind failed\n");   
  58.     closesocket(ListenSocket);   
  59.     return;   
  60.   }   
  61.   
  62.   //----------------------------------------   
  63.   // Start listening on the listening socket   
  64.   if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {   
  65.     printf("error listening\n");   
  66.   }    
  67.   printf("Listening on address: %s:%d\n", ip, port);   
  68.   
  69.   //----------------------------------------   
  70.   // Load the AcceptEx function into memory using WSAIoctl.   
  71.   // The WSAIoctl function is an extension of the ioctlsocket()   
  72.   // function that can use overlapped I/O. The function's 3rd   
  73.   // through 6th parameters are input and output buffers where   
  74.   // we pass the pointer to our AcceptEx function. This is used   
  75.   // so that we can call the AcceptEx function directly, rather   
  76.   // than refer to the Mswsock.lib library.   
  77.   WSAIoctl(ListenSocket,    
  78.     SIO_GET_EXTENSION_FUNCTION_POINTER,    
  79.     &GuidAcceptEx,    
  80.     sizeof(GuidAcceptEx),   
  81.     &lpfnAcceptEx,    
  82.     sizeof(lpfnAcceptEx),    
  83.     &dwBytes,    
  84.     NULL,    
  85.     NULL);   
  86.   
  87.   //----------------------------------------   
  88.   // Create an accepting socket   
  89.   AcceptSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
  90.   if (AcceptSocket == INVALID_SOCKET) {   
  91.     printf("Error creating accept socket.\n");   
  92.     WSACleanup();   
  93.     return;   
  94.   }   
  95.   
  96.   //----------------------------------------   
  97.   // Empty our overlapped structure and accept connections.   
  98.   memset(&olOverlap, 0, sizeof(olOverlap));   
  99.   
  100.   lpfnAcceptEx(ListenSocket,    
  101.     AcceptSocket,   
  102.     lpOutputBuf,    
  103.     outBufLen - ((sizeof(sockaddr_in) + 16) * 2),   
  104.     sizeof(sockaddr_in) + 16,    
  105.     sizeof(sockaddr_in) + 16,    
  106.     &dwBytes,    
  107.     &olOverlap);   
  108.   
  109.   //----------------------------------------   
  110.   // Associate the accept socket with the completion port   
  111.   CreateIoCompletionPort((HANDLE)AcceptSocket, hCompPort, (u_long)0, 0);   
  112.   
  113.   //----------------------------------------   
  114.   // Continue on to use send, recv, TransmitFile(), etc.,.   
  115.   ...   
  116.   
  117. }   

Notes for QOS
The TransmitFile function allows the setting of two flags, TF_DISCONNECT or TF_REUSE_SOCKET, that return the socket to a "disconnected, reusable" state after the file has been transmitted. These flags should not be used on a socket where quality of service has been requested, since the service provider may immediately delete any quality of service associated with the socket before the file transfer has completed. The best approach for a QOS-enabled socket is to simply call the closesocket function when the file transfer has completed, rather than relying on these flags.

Notes for ATM
There are important issues associated with connection setup when using Asynchronous Transfer Mode (ATM) with Windows Sockets 2. Please see the Remarks section in the accept function documentation for important ATM connection setup information.

Requirements
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 3.51 and later.
Server Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server 3.51 and later.
Header Declared in Mswsock.h.

Library Use Mswsock.lib.

DLL Requires Mswsock.dll.


如果你想它連接上就立即提示連接完成,則只須將dwReceiveDataLength賦0就OK.

使用AcceptEx()的一大好處是,
你可以通過一次調用就完成接受客戶端連接請求和接受數據(通過傳送lpOutputBuffer參數)兩件事情。
也就是說,如果客戶端在發出連接的同時傳輸數據,
你的AcceptEx()調用在連接創建并接收了客戶端數據后就可以立刻返回。
這樣可能是很有用的,但是也可能會引發問題,因為AcceptEx()必須等全部客戶端數據都收到了才返回。
具體來說,如果你在發出AcceptEx()調用的同時傳遞了 lpOutputBuffer參數,那么AcceptEx()不再是一項原子型的操作,
而是分成了兩步:接受客戶連接,等待接收數據。當缺少一種機制來通知你的應用程序所發生的這種情況:“連接已經建立了,正在等待客戶端數據”,這將意味著有可能出現客戶端只發出連接請求,但是不發送數據。

posted on 2008-04-28 14:47 RedLight 閱讀(1240) 評論(0)  編輯 收藏 引用 所屬分類: 網絡服務器開發

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導航

統計

公告


Name: Galen
QQ: 88104725

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

相冊

My Friend

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            噜噜噜久久亚洲精品国产品小说| 亚洲欧美日韩久久精品| 美女精品在线观看| 一区二区三区国产在线| 欧美电影免费| 尤物yw午夜国产精品视频明星 | 亚洲第一精品夜夜躁人人躁| 午夜在线精品偷拍| 亚洲午夜激情免费视频| 欧美日韩一区二区三区四区在线观看 | 亚洲一区二区三区激情| 欧美性片在线观看| 亚洲在线视频观看| 一区二区三区精密机械公司| 国产精品sss| 午夜精品久久久久99热蜜桃导演| 一区二区三区黄色| 国产精品入口麻豆原神| 欧美在线视频网站| 久久精品国产久精国产爱| 好吊一区二区三区| 久久资源在线| 欧美成人精品三级在线观看 | 中文在线不卡| 国产精品国色综合久久| 欧美伊人久久久久久午夜久久久久| 亚洲欧美国产精品专区久久| 国产亚洲欧美另类中文| 欧美超级免费视 在线| 欧美精品在线观看| 午夜精品成人在线视频| 久久成人人人人精品欧| 亚洲欧洲日本国产| 99在线热播精品免费99热| 国产精品色午夜在线观看| 久久免费的精品国产v∧| 模特精品在线| 午夜欧美大片免费观看| 久久精品久久综合| 一区二区日韩精品| 欧美一区二区三区久久精品茉莉花| 又紧又大又爽精品一区二区| 亚洲国产91| 国产精品国产三级国产aⅴ9色| 久久免费少妇高潮久久精品99| 欧美成人一区在线| 欧美一区二区在线视频| 美国成人直播| 亚洲一区二区精品在线| 欧美伊人久久久久久午夜久久久久 | 亚洲三级性片| 亚洲欧美另类国产| 亚洲日本一区二区三区| 亚洲欧美变态国产另类| 亚洲乱码一区二区| 香蕉久久夜色精品国产使用方法| 亚洲人体偷拍| 久久精彩免费视频| 午夜精彩视频在线观看不卡| 免费在线观看一区二区| 久久精品国产精品亚洲精品| 欧美区日韩区| 欧美黄色精品| 永久91嫩草亚洲精品人人| 一区二区三区四区国产| 亚洲电影毛片| 欧美在线视频观看免费网站| 亚洲一区二区三区高清 | 亚洲国产精品黑人久久久| 亚洲小说春色综合另类电影| 最新国产精品拍自在线播放| 欧美中文字幕| 亚洲综合成人婷婷小说| 欧美精品v国产精品v日韩精品| 久久在线免费观看视频| 国产一区二区欧美| 亚洲五月六月| 亚洲综合国产| 欧美日韩一区在线观看| 亚洲国产一区视频| 亚洲国产精品va| 久久久久亚洲综合| 久久―日本道色综合久久| 国产日韩一区二区三区在线| 亚洲欧美电影院| 久久久精品国产免费观看同学| 国产九九精品视频| 亚洲深夜福利视频| 午夜精品久久久99热福利| 国产九九精品视频| 欧美在现视频| 久久综合狠狠| 精东粉嫩av免费一区二区三区| 久久国内精品自在自线400部| 欧美一区三区三区高中清蜜桃| 国产精品亚洲综合天堂夜夜 | 国产夜色精品一区二区av| 亚洲欧美中日韩| 久久久久一区| 亚洲国产一成人久久精品| 媚黑女一区二区| 91久久中文| 亚洲综合99| 欧美高清在线一区二区| 亚洲激情一区| 亚洲视频在线观看免费| 国产精品女人网站| 亚洲午夜电影网| 久久精品中文字幕一区| 一区在线视频| 欧美日本三区| 亚洲一区二区在线视频| 久久精品亚洲热| 91久久在线视频| 欧美日韩一区二区三区| 小处雏高清一区二区三区 | 亚洲国内精品在线| 中文一区二区| 国内自拍视频一区二区三区| 老司机aⅴ在线精品导航| 亚洲人永久免费| 欧美一区二区三区久久精品茉莉花 | 欧美一区二区三区四区夜夜大片| 久久久久久久尹人综合网亚洲| 亚洲国产精彩中文乱码av在线播放| 欧美久久电影| 欧美在线观看视频| 亚洲国产一成人久久精品| 小处雏高清一区二区三区| 伊人激情综合| 欧美日韩大陆在线| 欧美自拍偷拍午夜视频| 亚洲国产精品女人久久久| 午夜国产精品视频| 亚洲欧洲日夜超级视频| 国产精品免费一区豆花| 麻豆精品精华液| 亚洲欧美在线高清| 亚洲人成网站影音先锋播放| 久久久国产精品一区二区中文| 日韩视频免费在线| 尤妮丝一区二区裸体视频| 国产精品久久国产愉拍| 欧美大片专区| 久久精品国产一区二区三| 一区二区三区色| 亚洲国产精品久久久久久女王| 欧美亚洲免费电影| 99精品欧美一区| 亚洲国产日韩综合一区| 国产午夜精品理论片a级大结局 | 欧美性jizz18性欧美| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜免费在线观看精品视频| 日韩一级精品视频在线观看| 欧美激情成人在线视频| 久久综合久色欧美综合狠狠| 午夜一区二区三区在线观看| 一本到高清视频免费精品| 亚洲国产福利在线| 狠狠久久亚洲欧美| 国产亚洲一二三区| 国产精品日日摸夜夜摸av| 欧美另类人妖| 欧美激情免费观看| 欧美精品久久99| 欧美国产日韩一二三区| 美女在线一区二区| 牛夜精品久久久久久久99黑人| 久久亚洲精品中文字幕冲田杏梨| 久久精品成人欧美大片古装| 欧美在线关看| 久久久久久久一区二区三区| 久久精品人人| 久久久久久久久久久久久9999| 欧美一区二区三区精品电影| 久久国产精品黑丝| 久久久久久成人| 久久亚洲视频| 裸体女人亚洲精品一区| 老司机精品福利视频| 免费观看一级特黄欧美大片| 免费在线观看精品| 欧美剧在线观看| 欧美三级午夜理伦三级中视频| 欧美三级日本三级少妇99| 国产精品九九久久久久久久| 国产精品影片在线观看| 国产欧美日韩一级| 激情综合激情| 亚洲看片一区| 亚洲欧美日韩国产成人| 欧美在线播放高清精品| 久色成人在线| 亚洲激情影视| 亚洲欧美中文日韩在线| 久久精品理论片| 欧美精品v日韩精品v国产精品| 国产精品久久999| 激情久久一区|