我有一个应用程序,其中单个客户端与单个服务器通信。通常,客户端执行单个connect
,然后反复调用send
,没有问题。
但是,我需要做一个版本,其中客户端为每个单独的send
设置连接(有点像带和不带keep-alive
的HTTP)。在此版本中,客户端调用socket
、connect
、send
一次,然后调用close
。
这样做的问题是我很快就会用完临时客户端端口,并且connect
失败。为了解决这个问题,我用SO_REUSEADDR
调用setsockopt
,然后在调用connect
之前绑定到端口0(例如,请参阅此处)。
这有效,但 TCP 连接不再可靠。我偶尔会收到不正确的数据,大概是因为 TCP 连接关闭时仍有数据。
有没有办法使它可靠(和快速)?shutdown
之前close
无济于事。也许我可以select
告诉我套接字是否已准备好输出,但这似乎有点矫枉过正。
你必须使用 TCP 吗?如果是这样,您可能必须保持打开的连接并通过该连接路由消息。
有SCTP,它可能非常适合您的用例 - 可靠的数据报协议:
与TCP一样,SCTP通过拥塞控制提供可靠的,面向连接的数据传输。与TCP不同,SCTP还提供消息绑定保存,有序和无序消息传递,多流和多宿主。通过使用校验和和序列号来检测数据损坏、数据丢失和数据重复。应用选择性重传机制来纠正数据丢失或损坏。