Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用SO_REUSEADDR时,TCP套接字连接变得不可靠_Linux_Sockets_Tcp - Fatal编程技术网

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的一个很糟糕的例子。你将不得不保持连接打开,并且失去关于什么更干净的想法。