createdevice错误使用Create出现WSAEADDRINUSE错误的解决办法.pdf
文本预览下载声明
createdevice错误:使用Create出现
WSAEADDRINUSE错误的解决办法
疯狂代码 http://CrazyC/ ĵ http:/CrazyC/VC/Article44547.html
源码:
DWORD WINAPI CServerSocket ListenThread(LPVOID lparam)
{
try
{
//加以下语句可消除Debug时出现afxwin1.inl报错
//该在Release时是不出现
//AFX_MANAGE_STATE(AfxGetStaticModuleState);
CServerSocket *pServerSocket=(CServerSocket *)lparam;
createSucceed=pServerSocket-Create(pServerSocket-Port); //第2次执行时在这里出现
WSAEADDRINUSE,原因是端口被占用
(createSucceed0)
{
AfxMessageBox(_ListenTcpThread Create!+pServerSocket-GetError(GetLastError));
-1;
}
listenSucceed=pServerSocket-Listen(10); //开始监听
(listenSucceed0)
{
AfxMessageBox(_ListenTcpThread Listen!+pServerSocket-GetError(GetLastError));
-1;
}
CSocket recSo;
SOCKADDR_IN client;
iAddrSize=(client);
Succeed=pServerSocket-Accept(recSo,(SOCKADDR *)client,iAddrSize); //接受连接并取得对方IP
}
先是查了不少文章堆搞不明白状况家伙胡乱指点有说是要AfxSocketInit,有说换个端口就可以了!
问题是我这个端口是监听我随机换话远程Client哪里知道该找哪个来连接???
总算找到下面段文字把原理给说清楚了!解决办法也很清楚 !
我处理是退出线程的前做下SetSockOpt代码如下:
//停止服务监听
BOOL CServerSocket StopServer
{
DWORD exitcode;
WaitForSingleObject(m_hServerThread,500);
//解决WSAEADDRINUSE解决办法 start
//加这几句可以解决:停止监听再重新开启监听出现Create语句发生WSAEADDRINUSE问题
//问题提示端口已经被占用
BOOL bDontLinger=FALSE;
this-SetSockOpt(SO_DONTLINGER,(const char *)bDontLinger,(bDontLinger),SOL_SOCKET);
this-Close;
//解决WSAEADDRINUSE解决办法 end
(!GetExitCodeThread(m_hServerThread,exitcode))
{
TerminateThread(m_hServerThread,exitcode);
}
m_hServerThread=NULL;
0;
}
为什么TCP关闭后端口会处于TIME_WAIT状态?
般来说tcp正常关闭需要 4个包比如a和b关闭连接a先给b发个finb会进行确认ack然后b也会发出fin当a接受到这
个fin并发出最后个ack后就会处于time_wait状态这个时间长短跟操作系统有关般会在1-4分钟也就是两倍数据
包(2msl)最大生存时间TCP主动关闭方采用TIME_WAIT主要是为了实现终止TCP全双工连接可靠性及允许老重
复分节在网络中消逝等过了2msl(大约1~4分钟)后TIME_WAIT就会消失
所以说主动发起关闭连接方会进入time_wait状态这个时候进程所占用端口号不能被释放除非在你中用
sockop
显示全部