文档详情

createdevice错误使用Create出现WSAEADDRINUSE错误的解决办法.pdf

发布:2017-07-01约2.45千字共3页下载文档
文本预览下载声明
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
显示全部
相似文档