我的监听线程是通过WSAEventSelect(FD_ACCEPT|FD_CLOSE)来触发的,每次有FD_ACCEPT过来,我就创建一个新线程。一般情况下,我的程序工作的很好。但有时候当同一客户机有连续请求到达时就会多收到请求。
我的客户机的一段代码:
for( int i = 0; i < nCount; i++)
{
AfxBeginThread( RequestThread,.....);
}
服务端代码:
for(;;)
{
WSAWaitForMultipleEvents( 1, lphEvents, false, WSA_INFINITE, false);
WSAEnumNetworkEvents( s, hEvent, pEvent);
switch( pEvent->lNetworkEvents )
{
case FD_ACCEPT: AfxBeginThread( ConnThread, ...)//我是在ConnThread中accept的 break;
case FD_CLOSE:
break; default:
return EXIT_FAILURE;
}
如nCount = 2 的时候,我的服务器端经常会收到 3 个请求,结果创建第3个SOCKET的时候就报错了。但有时候又是对的。 这是为什么
我的客户机的一段代码:
for( int i = 0; i < nCount; i++)
{
AfxBeginThread( RequestThread,.....);
}
服务端代码:
for(;;)
{
WSAWaitForMultipleEvents( 1, lphEvents, false, WSA_INFINITE, false);
WSAEnumNetworkEvents( s, hEvent, pEvent);
switch( pEvent->lNetworkEvents )
{
case FD_ACCEPT: AfxBeginThread( ConnThread, ...)//我是在ConnThread中accept的 break;
case FD_CLOSE:
break; default:
return EXIT_FAILURE;
}
如nCount = 2 的时候,我的服务器端经常会收到 3 个请求,结果创建第3个SOCKET的时候就报错了。但有时候又是对的。 这是为什么
解决方案 »
- 向mysql插中文出现错误 "incorrect string value:\x....."
- vista中sql2000数据库如何连接
- 这段代码是什么意思
- 怎样将多个包含对话框的工程集成为一个工程?
- 用IShellLink读出快捷方式里面的内容时,如果快捷方式无效,则弹出对话框,我得问题是怎么去掉错误提示对话框
- 麻烦给看一下这段代码是怎么用的?删除自己的程序.
- 有关安装nt server的问题
- 刘振安主编的自考教材《面向对象程序设计》一书对自考生的误导
- 效率:从大量数据中删除某些数据
- 模拟WINDOWS的控件(如cedit),自己定义新类如何下手,请高手指教
- 为什么加入了一个DBgrid空间之后,我的程序就只能编译,不能运行了?
- 请教编译方面的问题!
我的问题是为什么我收到的请求数目会比实际请求多
这是一个DirThread,目的是得到服务器指定目录下的文件列表。UINT _cdecl DirThread(LPVOID pParam):pDirParam = (DirParam*)pParam;
hWnd = pDirParam->hWnd;
addr.sin_addr.s_addr = inet_addr( pDirParam->strServerIP );
addr.sin_family = AF_INET;
addr.sin_port = htons(pDirParam->nPort);s = socket(AF_INET, SOCK_STREAM, 0);
ASSERT( s != INVALID_SOCKET );
nResult = connect(s, (sockaddr*)&addr, sizeof(sockaddr_in));
if ( nResult == SOCKET_ERROR )
{
//nErr = WSAGetLastError();
AfxMessageBox("连接失败,请检查网络");
ReleaseMutex( pDirParam->hMutex);
delete pDirParam;
closesocket(s);
return EXIT_FAILURE;
}基本就是这样,我这个问题已经搞了好几天了,大家请帮忙,讨论一下
{
AfxBeginThread( RequestThread,.....);
sleep (5000)
}连接了然后等一下嘛太快了,服务端的WSAEnumNetworkEvents也许会重富
完成端口模型能保证不会多收到请求吗?我以前还有个50分的帖子,也是这个问题的,解决了一起给分。
你多收到请求,我没有遇到过的,我在主线程里用的accept
还有就是
FD_ACCEPT Want to receive notification of incoming connections
FD_CONNECT Want to receive notification of completed connection
注意一下他们的区别。
accept 一个,就建一个线程。