使用完成端口实现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);
}
测试时,应用程序执行时
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);
}
解决方案 »
- VFW怎么把视频变成H264的视频流
- LoadImage的内存释放问题
- 问一个问题!怎么不打开vc执行我的程序?为什么点击DEBUG文件夹里的.EXE报错!
- 一个钩子的问题,分不够可以加
- ODS(_T("XFILE: Acl file xacl.cfg not exists."))什么意思啊??
- 线程里面如何给主进程发送消息?(谢谢给一个最简单的例子)
- 迷茫!
- 找一个vc比较牛的大哥,帮助问题!
- VC开发环境的乖事,大家有时间来看看
- 请教:如何在对话框中使用状态栏?急!
- 有谁知道从六安到长沙的K2075次为什么在12306上只能买到1月24的票吗,之后查询就没有那个车了啊。
- 动态修改工具栏及状态栏的提示
netstat -an 看看你机器的TCP连接多少个
查查:
1、计算机允许的最大连接数,
2、连接释放默认时间,(这俩都注册表里,网上搜一下就行了)
问题就是你用完就关,用完就关,老的都在排队等时间到了关闭,这样就没有新的可用了,就71了呗,要不试试能用长连接不?不要用了就关。