使用SO_REUSEADDR

时间:2017-05-18 14:59:29

标签: linux sockets tcp

我有一个应用程序,其中单个客户端与单个服务器通信。通常情况下,客户端会执行一次connect,然后重复调用send,并且没有问题。

但是,我需要做一个版本,其中客户端为每个人send建立一个连接(有点像有和没有keep-alive的HTTP)。在此版本中,客户端会调用socketconnectsend一次,然后调用close

这个问题是我很快耗尽了短暂的客户端端口,connect失败了。为了解决这个问题,我使用setsockopt调用SO_REUSEADDR,然后在调用connect之前绑定到端口0(例如,请参阅here)。

除了TCP连接不再可靠之外,这是有效的。我偶尔会得到不正确的数据,大概是因为TCP连接关闭时仍有数据。

有没有办法让这个可靠(快速)? shutdown之前的close没有帮助。也许我可以让select告诉我套接字是否已准备好输出,但这看起来有点矫枉过正。

1 个答案:

答案 0 :(得分:0)

你必须使用TCP吗?如果是这样,您可能必须保持打开连接并通过该连接路由您的消息。

SCTP,这可能非常适合您的用例 - 可靠的数据报协议:

  

与TCP一样,SCTP提供可靠的,面向连接的数据传输和拥塞控制。与TCP不同,SCTP还提供消息边界保存,有序和无序消息传递,多流和多宿主。使用校验和和序列号可以检测数据损坏,数据丢失和数据重复。应用选择性重传机制来纠正数据的丢失或损坏。