2013-05-09 52 views
0

因此,我的程序的基本前提是我应该创建一个tcp会话,通过它指导流量并检测任何连接丢失。如果连接断开,我需要关闭套接字并重新打开它们(使用相同的端口),以使它看起来像连接(几乎)不会死亡。还应该注意的是,这两个程序将被视为代理(数据被发送给它们,如果连接断开,它将被存储直到连接被修复,然后数据被发送出去)。使用C套接字:地址已经在使用

我做了一些研究,并已先行使用setsockopt的()与SO_REUSEADDR选项设置套接字选项,这样我可以重用的地址。

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

  1. 插座的初始设置后,开始发送数据
  2. x秒后,设置一个标志,假的,这将阻止所有发送其他数据
  3. 发送单个数据让其他程序知道连接仍处于打开状态,将计时器重置为x秒
  4. 如果我从程序接收到同一条数据,请将该标志设置为true继续发送
  5. 如果我没有收到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 
} 

由于我使用的定时器,关闭/重新打开插座,这是在不同的线程,将在预防:如果我有一个插座开放,我基本上通过以下操作读它套接字从关闭?

+0

我想你可以看看这些答案来尝试解决问题:http://stackoverflow.com/questions/15788007/address-already-in-use-sockets-in-c – Amadeus 2013-05-09 02:01:17

+1

这个循环条件应该是' > 0',而不是'> = 0'。你在EOS上循环。 – EJP 2013-05-09 02:03:30

+0

@TomásBadan我之前看到过这篇文章,我试着实现了setsockopt()调用,但就像我说的,我仍然得到错误。 – darklink41 2013-05-09 02:18:18

回答

1

似乎这里是别人叫bind()然后setsockopt(),不知道为什么setsockopt()不解决已经发生的bind()一个错误的疫情。

你必须调用setsockopt()第一。

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

+0

对不起,我想我没有指定这个。我在实际绑定套接字之前调用了setsockopt()。创建套接字时,该过程实际上是调用套接字(...),将该套接字传递给setsockopt(...),然后使用bind(...)绑定套接字。重新连接只是相同的过程,除非我先关闭套接字。使用相同的端口只是该程序的规格之一,所以我无法解决这个问题。 – darklink41 2013-05-09 02:16:18

+0

根据@ ChrisDodd的回答,你将不得不“解决”它,因为这是不可能的。如果关闭连接,则其本地端口最多只能处于TIME_WAIT状态,并且不能在两分钟内重新使用。整个事情从根本上是错误的,你可以告诉他们我们这么说。将规范寄回来自哪里。 – EJP 2013-05-09 02:29:08

2

SO_REUSEADDR只允许有限重新使用端口。具体而言,它不允许重用某个其他套接字当前正在主动侦听传入连接的端口。

相关问题