接收到client端的connect后,server端为每个client的winsocket分配一个线程,在线程内部使用select函数来检测该winsocket是否可读。
当client端断开winsocket后,再连接,出现10048(地址在使用中)的错误导致连接失败,可是过一会(大概5分钟)再来连,就连上了,怎么回事啊,该怎么样才能够每次都能连上??
当client端断开winsocket后,再连接,出现10048(地址在使用中)的错误导致连接失败,可是过一会(大概5分钟)再来连,就连上了,怎么回事啊,该怎么样才能够每次都能连上??
解决方案 »
- 修改LPVOID类型缓冲区出错
- CListCtrl焦点问题
- 第三方程序能不能关闭其他窗口的弹出的对话框窗口
- 程序在下载时不响应消息的问题!急!急!急!(在线等候)
- 怎么释放CListCtrl的lParam的内存
- 处理标题栏!!!急!!!
- VC的动态数组的问题,怎么解决?
- 一个基于forview多文档应用程序,如何实现新打开一幅位图,显示在打开的第一个文档的forview内?
- 短信发送模块,回答正确马上给分
- 我用MP3ENC控件做了一个MP3播放器,但拷贝到其它机器上却不能运行,需要也注册一份此控件,有没有办法不用再注册一份也能运行?
- 一个对象作为另外一个类的成员变量,它啥时候实例化?
- 是我的sdk版本问题么
// 函数功能: select 线程, 可读, 发送 消息 UM_READABILITY
//====================================================================
DWORD WINAPI SelectThread(LPVOID pParam)
{
if(pParam == NULL)
{
#ifdef _DEBUG
::MessageBox(NULL, "结束 select thread !", "Message Box", MB_OK);
#endif
return 0;
}
//得到传递的参数
CMySocket * pSocket = (CMySocket *)pParam;
int n;
fd_set readfds;
SOCKET socket;
struct timeval Timeval; Timeval.tv_sec = 0;
Timeval.tv_usec = 10;
socket = pSocket->GetSocket(); //进入无限循环,直到主线程结束
while(true)
{
if(::g_bOverThread == true)
{
#ifdef _DEBUG
//::MessageBox(NULL, "结束 select thread !", "Message Box", MB_OK);
#endif
//??????
//pSocket->Close();
return 1;
}
DWORD word = ::WaitForSingleObject(::g_handle, 0);
if(word == WAIT_OBJECT_0) //g_handle is signaled
{
#ifdef _DEBUG
//::MessageBox(NULL, "结束 select thread !", "Message Box", MB_OK);
#endif
//??????
::MessageBox(NULL,"recv shutdown","Message Box",MB_OK);
pSocket->Close();
return 1;
}
if(socket != 0)
{
FD_ZERO(&readfds);
FD_SET(socket, &readfds);
n = ::select(0, &readfds, NULL, NULL, &Timeval);
if(n == SOCKET_ERROR)
{
#ifdef _DEBUG
::MessageBox(NULL, "Select 失败 !", "Messsage Box", MB_OK);
#endif
return 0;
}
if(n > 0)
{
if(FD_ISSET(socket, &readfds))
{
//{{可读, 发送消息 UM_READABILITY
CChat_ServerApp * pwnd = (CChat_ServerApp *)::AfxGetApp();
#if 1
::SendMessage(pwnd->m_pMainWnd->m_hWnd,
UM_READABILITY,
(WPARAM)pSocket,
NULL);
#else
::PostMessage(pwnd->m_pMainWnd->m_hWnd,
UM_READABILITY,
(WPARAM)pSocket,
NULL);
#endif
//}}可读, 发送消息 UM_READABILITY
}
}
}
}
}以上我的程序中server端的select线程,注释???的地方是销毁socket,看看是什么错误?