我正在使用异步调用编写TCP客户端。如果服务器在应用程序启动时处于活动状态,则它会连接并说话正常。但是,如果第一次连接失败,则对connect()的每次后续调用都会失败并且WSAENOTCONN(10057)不会产生任何网络流量(使用Wireshark检查)。
目前,代码在收到错误时不会关闭套接字。 TCP状态图似乎不需要它。它只需等待30秒并再次尝试连接()。
后续的connect()和后面的read()都返回WSAENOTCONN错误。
我是否需要关闭套接字并打开一个新套接字?如果是这样,哪些错误要求我关闭套接字,因为有很多不同的错误,其中一些我可能永远不会在测试台上看到。
你可以假设这是MS Winsock2,虽然它实际上是Interval Zero RTX 2009,在某些地方略有不同。
答案 0 :(得分:1)
我是否需要关闭套接字并打开一个新套接字?
是
如果是这样,哪些错误需要我关闭套接字,因为存在很多不同的错误,其中一些我可能永远不会在测试台上看到。
几乎所有错误对连接都是致命的,并且应该导致您关闭套接字。 EAGAIN / EWOULDBLOCK是一个突出的例外,就像EINTR一样,但我不能随便想到任何其他人。
答案 1 :(得分:0)
我是否需要关闭套接字并打开一个新套接字?
是
你应该在所有错误条件下关闭套接字导致连接变好(比如说,对等关闭了连接)