因此,我的程序的基本前提是我应该创建一个tcp会话,通过它指导流量并检测任何连接丢失。如果连接断开,我需要关闭套接字并重新打开它们(使用相同的端口),以使它看起来像连接(几乎)不会死亡。还应该注意的是,这两个程序将被视为代理(数据被发送给它们,如果连接断开,它将被存储直到连接被修复,然后数据被发送出去)。使用C套接字:地址已经在使用
我做了一些研究,并已先行使用setsockopt的()与SO_REUSEADDR选项设置套接字选项,这样我可以重用的地址。
这里是基本的算法,我使用信号来检测连接中断:
- 插座的初始设置后,开始发送数据
- x秒后,设置一个标志,假的,这将阻止所有发送其他数据
- 发送单个数据让其他程序知道连接仍处于打开状态,将计时器重置为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
}
由于我使用的定时器,关闭/重新打开插座,这是在不同的线程,将在预防:如果我有一个插座开放,我基本上通过以下操作读它套接字从关闭?
我想你可以看看这些答案来尝试解决问题:http://stackoverflow.com/questions/15788007/address-already-in-use-sockets-in-c – Amadeus 2013-05-09 02:01:17
这个循环条件应该是' > 0',而不是'> = 0'。你在EOS上循环。 – EJP 2013-05-09 02:03:30
@TomásBadan我之前看到过这篇文章,我试着实现了setsockopt()调用,但就像我说的,我仍然得到错误。 – darklink41 2013-05-09 02:18:18