TCP通信客户端不定时出现超时 然后重新连接出现10060错误

时间:2021-05-05 20:21:49
请教大神
 我做了一个三系统(XPE)局域网TCP通信的小程序
服务器端:
           采用TCP事件模型,分为accept循环和读写事件响应线程,另有1个线程负责收集本系统的数据并填入消息发送缓冲区和解析接收缓冲区的数 据。在“读写事件响应线程”每Sleep(60)ms后,轮询2个客户端的事件,轮询一个客户端时先检查收件消息,再检查发送缓冲区是否有消息需要发送,提取两天消息合并为1条发送出去。在消息收集与解析线程里也是每60ms循环一次。

客户端:
          采用select模型,bind本机地址,非阻赛模式通信,10秒超时。在send&rec循环里每60ms收入一次消息,在消息收集与解析线程里也是每60ms一个循环。

问题: 
       三个系统一般时同步启动,客户端在运行若干小时后容易出现“select time out”,然后本人在closesocket套接字后退出循环,重新初始化套接字、bind、connect服务器,此时connect会出现10060错误,需要“禁止”再“启用”这台系统的网络连接才能连上服务器并恢复通信。
      想知道这中间是什么原因导致超时?重连时出现10060错误?需要怎么解决?
          

5 个解决方案

#1


TCP连接失败,是不是用完的socket等没有正确关闭释放

#2


有可能是socket的问题,在查下楼主

#3


sckOutOfMemory   7   内存不足   
sckInvalidPropertyValue   380   属性值无效。   
sckGetNotSupported   394   属性不可读。   
sckSetNotSupported   383   属性是只读的。   
sckBadState   40006   所请求的事务或请求本身的错误协议或者错误连接状态。   
sckInvalidArg   40014   传递给函数的参数格式不确定,或者不在指定范围内。   
sckSuccess   40017   成功。   
sckUnsupported   40018   不受支持的变量类型。   
sckInvalidOp   40020   在当前状态下的无效操作   
sckOutOfRange   40021   参数越界。   
sckWrongProtocol   40026   所请求的事务或请求本身的错误协议   
sckOpCanceled   1004   取消操作。   
sckInvalidArgument   10014   所请求的地址是广播地址,但未设置标记。   
sckWouldBlock   10035   套接字不成块,而指定操作将使之成块。   
sckInProgress   10036   制造块的   Winsock   操作在进行之中。   
sckAlreadyComplete   10037   完成操作。未进行制造块的操作。   
sckNotSocket   10038   描述符不是套接字。   
sckMsgTooBig   10040   数据报太大,不适于缓冲区的要求,因而被截断。   
sckPortNotSupported   10043   不支持指定的端口。   
sckAddressInUse   10048   地址在使用中。   
sckAddressNotAvailable   10049   来自本地机器的不可用地址。   
sckNetworkSubsystemFailed   10050   网络子系统失败。   
sckNetworkUnreachable   10051   此时不能从主机到达网络。   
sckNetReset   10052   在设置   SO_KEEPALIVE   时连接超时。   
sckConnectAborted   11053   由于超时或者其它失败而中止连接。   
sckConnectionReset   10054   通过远端重新设置连接。   
sckNoBufferSpace   10055   没有可用的缓冲空间。   
sckAlreadyConnected   10056   已连接套接字。   
sckNotConnected   10057   未连接套接字。   
sckSocketShutdown   10058   已关闭套接字。   
sckTimedout   10060   已关闭套接字。   
sckConnectionRefused   10061   强行拒绝连接。   
sckNotInitialized   10093   应首先调用   WinsockInit。   
sckHostNotFound   11001   授权应答:未找到主机。   
sckHostNotFoundTryAgain   11002   非授权应答:未找到主机。   
sckNonRecoverableError   11003   不可恢复的错误。   
sckNoData   11004   无效名,对所请求的类型无数据记录。

#4


socket的Reuse属性设置了没有?

#5


用完的socket等没有正确关闭释放 

#1


TCP连接失败,是不是用完的socket等没有正确关闭释放

#2


有可能是socket的问题,在查下楼主

#3


sckOutOfMemory   7   内存不足   
sckInvalidPropertyValue   380   属性值无效。   
sckGetNotSupported   394   属性不可读。   
sckSetNotSupported   383   属性是只读的。   
sckBadState   40006   所请求的事务或请求本身的错误协议或者错误连接状态。   
sckInvalidArg   40014   传递给函数的参数格式不确定,或者不在指定范围内。   
sckSuccess   40017   成功。   
sckUnsupported   40018   不受支持的变量类型。   
sckInvalidOp   40020   在当前状态下的无效操作   
sckOutOfRange   40021   参数越界。   
sckWrongProtocol   40026   所请求的事务或请求本身的错误协议   
sckOpCanceled   1004   取消操作。   
sckInvalidArgument   10014   所请求的地址是广播地址,但未设置标记。   
sckWouldBlock   10035   套接字不成块,而指定操作将使之成块。   
sckInProgress   10036   制造块的   Winsock   操作在进行之中。   
sckAlreadyComplete   10037   完成操作。未进行制造块的操作。   
sckNotSocket   10038   描述符不是套接字。   
sckMsgTooBig   10040   数据报太大,不适于缓冲区的要求,因而被截断。   
sckPortNotSupported   10043   不支持指定的端口。   
sckAddressInUse   10048   地址在使用中。   
sckAddressNotAvailable   10049   来自本地机器的不可用地址。   
sckNetworkSubsystemFailed   10050   网络子系统失败。   
sckNetworkUnreachable   10051   此时不能从主机到达网络。   
sckNetReset   10052   在设置   SO_KEEPALIVE   时连接超时。   
sckConnectAborted   11053   由于超时或者其它失败而中止连接。   
sckConnectionReset   10054   通过远端重新设置连接。   
sckNoBufferSpace   10055   没有可用的缓冲空间。   
sckAlreadyConnected   10056   已连接套接字。   
sckNotConnected   10057   未连接套接字。   
sckSocketShutdown   10058   已关闭套接字。   
sckTimedout   10060   已关闭套接字。   
sckConnectionRefused   10061   强行拒绝连接。   
sckNotInitialized   10093   应首先调用   WinsockInit。   
sckHostNotFound   11001   授权应答:未找到主机。   
sckHostNotFoundTryAgain   11002   非授权应答:未找到主机。   
sckNonRecoverableError   11003   不可恢复的错误。   
sckNoData   11004   无效名,对所请求的类型无数据记录。

#4


socket的Reuse属性设置了没有?

#5


用完的socket等没有正确关闭释放