使用完成端口实现USB异步通信(写)
测试时,应用程序执行时
GetQueuedCompletionStatus中GetLastError返回71错误
(71)当前已无法再同此远程计算机连接,因为已达到计算机的连接数目极限
请教各位大神,遇到这种情况应该从哪方面入手去进行修改
谢谢
代码如下:
ULONG AsyncIo(PVOID  ThreadParameter)
{
HANDLE hDevice = INVALID_HANDLE_VALUE;
HANDLE hCompletionPort = NULL;
OVERLAPPED pOvList = {0};
ULONG   ioType = (ULONG)(ULONG_PTR)ThreadParameter;
ULONG   error;
ULONG nBytes;
CHAR *pOutBuf = (char*)malloc(sizeof(char)*8);
strcpy(pOutBuf,"Yes");  hDevice = OpenDevice(TRUE);//异步打开设备 if (hDevice == INVALID_HANDLE_VALUE) {
printf("Cannot open device %d\n", GetLastError());
goto Error;
} hCompletionPort = CreateIoCompletionPort(hDevice, NULL, 1, 0); if (hCompletionPort == NULL) {
printf("Cannot open completion port %d \n",GetLastError());
goto Error;
} //发出异步 I/O
 
if (ioType == WRITER_TYPE) {
if ( WriteFile( hDevice,pOutBuf,8,&nBytes,&pOvList) == 0) {
error = GetLastError();
if (error != ERROR_IO_PENDING) {
printf("write failed %d \n", GetLastError());
goto Error;
}
}
}

 //等待 I/O 完成. 如果一个完成则重新发送 I/O
WHILE (1) {
LPOVERLAPPED completedOv;
ULONG_PTR   key;
ULONG     numberOfBytesTransferred; if ( GetQueuedCompletionStatus(hCompletionPort, &numberOfBytesTransferred,&key, &completedOv, INFINITE) == 0) {
printf("GetQueuedCompletionStatus failed %d\n", GetLastError());
goto Error;
} // 写完成,发出另一个。 if (ioType == WRITER_TYPE){ printf("Number of bytes written by request number is %d\n", numberOfBytesTransferred); if ( WriteFile( hDevice,pOutBuf,8,&nBytes,completedOv) == 0) {
error = GetLastError();
if (error != ERROR_IO_PENDING) {
printf("write failed %d \n", GetLastError());
goto Error;
}
}
}
}Error:
if (hDevice != INVALID_HANDLE_VALUE) {
CloseHandle(hDevice);
} if (hCompletionPort) {
CloseHandle(hCompletionPort);
} return 1;
}int _cdecl main(__in int argc,__in_ecount(argc) LPSTR  *argv)
{
AsyncIo((PVOID)WRITER_TYPE);
}

解决方案 »

  1.   

    error_code:71 已达到计算机的连接数最大值,无法再同此远程计算机连接。 
      

  2.   


    netstat -an 看看你机器的TCP连接多少个
      

  3.   

    你看上面大多都是TIME_WAIT的状态,标识正在关闭。
    查查:
    1、计算机允许的最大连接数,
    2、连接释放默认时间,(这俩都注册表里,网上搜一下就行了)
    问题就是你用完就关,用完就关,老的都在排队等时间到了关闭,这样就没有新的可用了,就71了呗,要不试试能用长连接不?不要用了就关。