所以我的程序的基本前提是我应该创建一个 tcp 会话,引导流量通过它,并检测任何连接丢失。如果连接确实中断,我需要关闭套接字并重新打开它们(使用相同的端口),以使连接看起来(几乎)从未中断。还应该注意的是,这两个程序将被视为代理(数据被发送给它们,如果连接中断,它将被存储,直到连接修复,然后数据被发送出去)。
我已经做了一些研究并继续使用 setsockopt() 和 SO_REUSEADDR 选项来设置套接字选项,以便我可以重用地址。
这是我使用信号检测连接中断的基本算法:
- 初始设置套接字后,开始发送数据
- x 秒后,将标志设置为 false,这将阻止发送所有其他数据
- 发送一条数据让其他程序知道连接仍然打开,将计时器重置为x秒
- 如果我从程序接收到相同的数据,请将标志设置为 true 以继续发送
- 如果我在 x 秒后没有收到数据,请关闭套接字并尝试重新连接
(第 5 步是我得到错误的地方)。
本质上,一个程序是一个客户端(在一个 VM 上),一个程序是一个服务器(在另一个 VM 上),每个程序都相互发送和接收数据,以及每个 VM 上的另一个程序发送和接收数据。
我的问题是:鉴于在设置套接字选项后我仍然收到此错误,为什么在检测到连接时不允许我重新绑定地址?
当检测到断开连接时,服务器是抱怨的(我关闭套接字,打开一个新的,设置选项,并尝试使用相同的信息绑定端口)。
另一件值得注意的事情是我从套接字接收数据的方式。如果我打开了一个套接字,我基本上是通过执行以下操作来阅读它:
while((x = recv(socket, buff, 1, 0)>=0){
//add to buffer
// send out to other program if connection is alive
}
由于我使用计时器来关闭/重新打开套接字,并且这是在不同的线程中,这会阻止套接字关闭吗?