关于套接字和accept()的一些问题

时间:2017-02-05 01:07:33

标签: c sockets fault-tolerance

假设我们创建了一个包含socket()的套接字,然后我们使用了bind()listen()。然后我们使用accept()等待客户端请求,如果我们关闭服务器连接客户端(例如我们ctrl + c进程)。

  1. 客户端是否仍然连接到端口?
  2. 我们可以以某种方式重新建立与套接字的连接吗?
  3. 这也是客户端问题吗?或recvfrom()等待某人绑定回套接字?

2 个答案:

答案 0 :(得分:3)

我假设您正在使用TCP。

  

如果我们关闭服务器:

  1. 客户端是否仍然连接到端口?

    没有。服务器端的操作系统将注意到服务器已终止,并将关闭连接,向客户端发送数据包以结束连接。即使没有发生这种情况(例如网络发生故障),连接也不再可用,并且第一次客户端发送内容时,它将意识到连接丢失。有些程序使用TCP Keep-Alive或发送心跳消息,以确保它们注意到服务器是否消失。

  2. 我们可以以某种方式重新建立与套接字的连接吗?

    没有。客户需要建立新的连接。

  3. 这也是客户端问题吗?或者recvfrom()等待某人绑定回套接字?

    legs.forEach({ (leg) let legID = leg["Id"].stringValue var searchInboundItinerariy: JSON = JSON.null var searchOutboundItinerariy: JSON = JSON.null for itinerariyValue in itinerariy { let inboundID = itinerariyValue["InboundLegId"].stringValue let outboundID = itinerariyValue["OutboundLegId"].stringValue if inboundID == legID { searchInboundItinerariy = itinerariyValue } if outboundID == legID { searchOutboundItinerariy = itinerariyValue } let inboundPrice = searchInboundItinerariy["PricingOptions"][0]["Price"].doubleValue let finalInbound = InboundID(price: inboundPrice, deepLinkURL: inboundDeeplink, carrier: inboundCarrierName, carrierImage: inboundCarrierImage, inboundCode: inboundAirportCode, stringPrice: sPrice) 不会以这种方式等待。服务器无法重新连接"或者"重新绑定"就像你暗示的那样。客户端需要通过明确重新连接来响应断开连接。

答案 1 :(得分:2)

  

客户端是否仍然连接到端口?

客户端在Windows上读取时会重置连接,或者在* nix下读取时会重置EOS,或者在写入时重置连接。

  

我们可以以某种方式重新建立与套接字的连接吗?

端口。客户端可以尝试重新连接,但在服务器运行和监听之前它不会成功。重启后,服务器无法对其进行任何操作。

  

这也是客户端问题吗?

是的,见上文。

  

recvfrom()等待某人绑定回套接字?

当然不是。

注意:您应该将recv()用于流套接字。您不需要提供源地址信息recvfrom(),如果确实如此,因为它已经通过套接字上的getpeername()提供了。