TCP 套接字连接因SO_REUSEADDR而变得不可靠



我有一个应用程序,其中单个客户端与单个服务器通信。通常,客户端执行单个connect,然后反复调用send,没有问题。

但是,我需要做一个版本,其中客户端为每个单独的send设置连接(有点像带和不带keep-alive的HTTP)。在此版本中,客户端调用socketconnectsend一次,然后调用close

这样做的问题是我很快就会用完临时客户端端口,并且connect失败。为了解决这个问题,我用SO_REUSEADDR调用setsockopt,然后在调用connect之前绑定到端口0(例如,请参阅此处)。

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

有没有办法使它可靠(和快速)?shutdown之前close无济于事。也许我可以select告诉我套接字是否已准备好输出,但这似乎有点矫枉过正。

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

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

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

最新更新