Socket复用时出现10022错误!

jw5858 2012-02-03 06:00:44
设想在服务器能够复用关闭的Socket,但我在进行测试时总是出现错误,求各位兄弟帮忙解答!问题描述如下:
创建SOCKET并设置了SO_REUSEADDR属性
 WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED) 
客户端请求连接(连接同时发送了数据包)
 BOOL bSuccess = lpfnConnectEx( m_hSocket, (SockAddr*)&m_sockAddr, sizeof(SockAddr), m_writeIOData.szBuf, uLen, &dwSendLen, &m_writeIOData.overlapped ); 


工作线程
1、客户端正常断开时会向服务器发送断开连的接数据包
2、服务器收到断开请求后主动调用
lpfnDisconnectEx(m_hSocket, &m_writeIOData.overlapped, TF_REUSE_SOCKET, 0);

函数执行成功后调用AcceptEx想复用该m_hSocket
// Sleep(300); 如果Sleep才能每次设置成功,否则经常报10022错误
lpfnAcceptEx( listenSocket,
m_hSocket,
m_readIOData.szBuf,
m_readIOData.nBufLen-((sizeof(sockaddr_in) + 16) * 2),
sizeof(sockaddr_in) + 16,
sizeof(sockaddr_in) + 16,
&dwBytes,
&m_readIOData.overlapped ); //这里出错
事与愿违在lpfnAcceptEx时,偶尔能成功偶尔失败返回的错误代码为WSAEINVAL 10022
3、客户端收到数据包长度为0时同样会调用
  lpfnDisconnectEx(m_hSocket, &m_writeIOData.overlapped, TF_REUSE_SOCKET, 0);
一个Socket的管理线程,当空闲队列的Socket少于指定数量时新创建一批WSASocket
一个IO工作线程
一个数据包处理线程
测试时客户端和服务端都仅分配一个WSASocket进行测试
我开始怀疑是线程同步创建Acceptex参数非法,但我反复确认后问题仍然出现
后来我在DisconnectEx与Acceptex之间加Sleep(300)发现问题能得到解决(只是在客户端和服务端只有一个WSASocket进行了测试,我猜测DisconnectEx断开连接时需要时间,在这时间段内复用Socket时会失败。我设置SO_LINGER {1,0}、SO_DONTLINGER也不行。

希望各位能帮忙解答,先谢谢各位了!
...全文
791 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌枫 2012-02-07
  • 打赏
  • 举报
回复
在那句话打个断点,看看是不是有一些数据已经为空了,所以导致参数不正确
jw5858 2012-02-03
  • 打赏
  • 举报
回复
在线等答案!!!!!!
jw5858 2012-02-03
  • 打赏
  • 举报
回复
参数我仔细检查了,没有发现不对,
所以我怀疑是不是m_hSocket有问题,当从调试看不出该参数是否有问题,
不知有不有API函数检测一个Socket的状态,因为我想确认一下是不是刚好处在断开时握手阶段。
麻烦楼上能详细说明一下 无效的参数。
Eleven 2012-02-03
  • 打赏
  • 举报
回复
10022: 提供了一个无效的参数。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧