Linux 使用SO_REUSEADDR时,TCP套接字连接变得不可靠
我有一个应用程序,其中一个客户端与一个服务器对话。通常情况下,客户端只进行一次Linux 使用SO_REUSEADDR时,TCP套接字连接变得不可靠,linux,sockets,tcp,Linux,Sockets,Tcp,我有一个应用程序,其中一个客户端与一个服务器对话。通常情况下,客户端只进行一次连接,然后反复调用发送,没有问题 但是,我需要做一个版本,在这个版本中,客户端为每个发送设置一个连接(有点像HTTP,有没有保持活动状态)。在此版本中,客户端调用套接字,连接,发送一次,然后关闭 问题是我很快就用完了临时客户端端口,connect失败了。为了解决这个问题,我使用调用setsockopt,然后在调用connect之前绑定到端口0(例如,请参阅) 除了TCP连接不再可靠外,这是可行的。我偶尔会收到不正确的数
连接
,然后反复调用发送
,没有问题
但是,我需要做一个版本,在这个版本中,客户端为每个发送设置一个连接(有点像HTTP,有没有保持活动状态
)。在此版本中,客户端调用套接字
,连接
,发送
一次,然后关闭
问题是我很快就用完了临时客户端端口,connect
失败了。为了解决这个问题,我使用调用setsockopt
,然后在调用connect
之前绑定到端口0(例如,请参阅)
除了TCP连接不再可靠外,这是可行的。我偶尔会收到不正确的数据,大概是因为TCP连接关闭时仍然有数据
有什么方法可以使它可靠(快速)吗<代码>关闭
之前的关闭
没有帮助。也许我可以让select
告诉我套接字是否已准备好输出,但这似乎有些过分。您必须使用TCP吗?如果是这样,您可能必须保持一个开放的连接,并通过该连接路由消息
有一种可能非常适合您的用例—可靠的数据报协议:
与TCP一样,SCTP通过拥塞控制提供可靠的、面向连接的数据传输。与TCP不同,SCTP还提供消息绑定保存、有序和无序消息传递、多流和多主。通过使用校验和和和序列号来检测数据损坏、数据丢失和数据重复。选择性重传机制用于纠正数据丢失或损坏
您多久打一次电话给
send
?TCP并不是专门为连接
-发送
-关闭
重复周期而设计的,因为TCP设置和拆卸可能会很昂贵。你能告诉我们你为什么需要这个吗?为什么不能使用connect
-send
-send
-…-<代码>关闭?也许你应该考虑使用未连接的UDP来代替?端应用程序偶尔会发送高频包的突发,但也可以在发送之间等待更长的时间。它偶尔会失败,正在重新编写(从boost::asio到plain-old-C)。当前代码是一个测试,以找出可能的情况-如果我必须连接一次并保持连接打开,我会这样做,但我想确定这是唯一或最好的选择connect
-send
-close
从错误恢复的角度来看,它可能更干净。记住TCP是一个可靠的协议。如果出现错误,send或receive calls会告诉您,此时您会执行错误恢复(通过断开连接并重试连接)。正如我所说,TCP中的连接设置和断开是昂贵的,旧的HTTP在这方面是如何使用TCP的一个很糟糕的例子。你将不得不保持连接打开,并且失去关于什么更干净的想法。