使用C套接字:地址已在使用中

时间:2013-05-09 01:51:59

标签: c sockets

所以我的程序的基本前提是我应该创建一个tcp会话,通过它来引导流量,并检测任何连接丢失。如果连接确实中断,我需要关闭套接字并重新打开它们(使用相同的端口),使得连接(几乎)永远不会死亡。还应该注意的是,这两个程序将被视为代理(数据被发送给它们,如果连接断开,它将被存储,直到连接被修复,然后发送数据)。

我做了一些研究并继续使用了带有SO_REUSEADDR选项的setsockopt()来设置套接字选项,以便我可以重用该地址。

这是我使用信号检测连接中断的基本算法:

  1. 初始设置套接字后,开始发送数据
  2. x秒后,将标志设置为false,这将阻止发送所有其他数据
  3. 发送单个数据让其他程序知道连接仍然打开,将计时器重置为x秒
  4. 如果我从程序中收到相同的数据,请将标志设置为true以继续发送
  5. 如果我在x秒后没有收到数据,请关闭套接字并尝试重新连接
  6. (第5步是我收到错误的地方)。

    基本上一个程序是一个客户端(在一个VM上),一个程序是一个服务器(在另一个VM上),每个程序相互之间以及从每个VM上的另一个程序发送和接收数据。

    我的问题是:鉴于我在设置套接字选项后仍然收到此错误,为什么在检测到连接时我不允许重新绑定地址?

    当检测到断开连接时,服务器是抱怨的(我关闭套接字,打开一个新设置,设置选项,并尝试使用相同的信息绑定端口)。

    另外需要注意的是我从套接字接收数据的方式。如果我打开套接字,我基本上是通过执行以下操作来阅读它:

    while((x = recv(socket, buff, 1, 0)>=0){
    
        //add to buffer
        // send out to other program if connection is alive
    }
    

    由于我正在使用定时器关闭/重新打开套接字,并且这是在另一个线程中,这是否会阻止套接字关闭?

2 个答案:

答案 0 :(得分:3)

SO_REUSEADDR仅允许限制重复使用端口。具体来说,它不允许重用某个其他套接字当前正在主动侦听传入连接的端口。

答案 1 :(得分:1)

此处似乎有一种流行病,人们呼叫bind()然后setsockopt(),并想知道为什么setsockopt()无法解决bind()上已发生的错误

您必须先致电setsockopt()

但我不明白你的问题。为什么你认为你需要使用相同的端口?为什么要设置阻止您发送数据的标志?你不需要这些。只需处理send()上的错误,如果出现错误,必要时创建新连接。不要试图超越TCP。许多人尝试过,很少有人成功。