贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

[还是没解决]有关ACE_SOCK_Connector的connect()

sokiiya 发表于: 2008-5-26 09:29 来源: ACE 开发者

用同一个ACE_INET_Addr local_addr(3366);
去reuse端口,发出各个连接。
if (connector.connect(stream, remote_addr, 0, local_addr, 1) == -1)
{
  ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p\n", "connection failed"), -1);
}
第一个进程这样做可以连到remote_addr。
再开一个connect的时候就出错了,ACE_ERROR_RETURN打印出来“connection failed:address already in use”。
那个connect的第五个参数“1”已经表示reuse了,但是怎么还会出现这样的问题呢?

[ 本帖最后由 sokiiya 于 2008-5-26 10:07 编辑 ]

最新回复

winston at 2008-5-26 09:32:34
TCP是依靠2对地址来唯一标识一个链接的。本地地址、端口 -> 对端地址、端口。
如果本机中,这四项内容重复,无论你如何设置重用地址,也是没用的。你去除端口的指定试试。
sokiiya at 2008-5-26 09:33:12
服务端打开的时候也用了reuse参数:
ACE_INET_Addr server_addr(5050);
acceptor.open(server_addr, 1)

不知道我还少了什么呢?
sokiiya at 2008-5-26 09:36:10

QUOTE:

原帖由 winston 于 2008-5-26 09:32 发表
TCP是依靠2对地址来唯一标识一个链接的。本地地址、端口 -> 对端地址、端口。
如果本机中,这四项内容重复,无论你如何设置重用地址,也是没用的。你去除端口的指定试试。 ...
试了,当然可以,这样就不是从同一端口出发了。
可是目前需要复用那个端口。。。
winston at 2008-5-26 09:46:34
重用端口意义在哪里?
如果对端地址是一样的,那肯定是没办法重用的,必然冲突。这个是TCP的设计,无法逾越。
sokiiya at 2008-5-26 09:47:14

QUOTE:

原帖由 winston 于 2008-5-26 09:32 发表
TCP是依靠2对地址来唯一标识一个链接的。本地地址、端口 -> 对端地址、端口。
如果本机中,这四项内容重复,无论你如何设置重用地址,也是没用的。你去除端口的指定试试。 ...
呵呵~~~我知道了,就是你说的“本地地址、端口 -> 对端地址、端口”这4个都重复了。
所以才不行。懂了。谢谢。
sokiiya at 2008-5-26 10:01:41
。。。。。。不过又有问题了。
我从一台机器连到两个不同server,这时候,又出现了address already in use的错误。。。。
winston at 2008-5-26 10:07:31
打开DEBUG,看看错误的细节信息。
sokiiya at 2008-5-26 10:32:31
if (connector.connect(stream, remote_addr, 0, local_addr, 1) == -1)
{
  ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p\n", "connection failed"), -1);
}
打印出来“connection failed:address already in use”。

怎么看,需要进入connect函数吗?
winston at 2008-5-26 10:35:39
看看地址信息,是否重复。
sokiiya at 2008-5-26 11:02:25
没有重用,两次的remote_addr是不同的。
sokiiya at 2008-5-26 11:10:25
可以看到ACE_INET_Addr那个类里面,
inet_addr.sin_addr.S_un.S_un_b两次分别是10.80.1.104和10.80.1.115
inet_addr.sin_addr.S_un.S_un_w两次分别是{s_w1=20490 s_w2=26625}和{s_w1=20490 s_w2=29441}
inet_addr.sin_addr.S_un.S_addr两次分别是1744916490和1929465866




测试程序大致是这样:
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
        ACE_Thread::spawn((ACE_THR_FUNC)worker1);
        ACE_Thread::spawn((ACE_THR_FUNC)worker2);
//......and so on
}


ACE_THR_FUNC_RETURN worker1(void*)
{
        ACE_INET_Addr remote_addr(5050, "10.80.1.115");
        ACE_INET_Addr local_addr(8067);
        ACE_SOCK_Connector connector;
        ACE_SOCK_Stream stream;

        if (connector.connect(stream, remote_addr, 0, local_addr, 1) == -1)
        {
                ACE_OS::sleep(3);
                ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p\n", "connection fail"), -1);
        }
//.....and so on
}


ACE_THR_FUNC_RETURN worker2(void*)
{
        ACE_INET_Addr remote_addr(5050, "10.80.1.104");
        ACE_INET_Addr local_addr(8067);
        ACE_SOCK_Connector connector;
        ACE_SOCK_Stream stream;

        if (connector.connect(stream, remote_addr, 0, local_addr, 1) == -1)
        {
                ACE_OS::sleep(3);
                ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p\n", "connection fail"), -1);
        }
//.....and so on
}

[ 本帖最后由 sokiiya 于 2008-5-26 11:26 编辑 ]
winston at 2008-5-26 11:48:05
你的代码有问题。
你不能同时用两个socket绑定本地同一个地址和端口,肯定出错。但一个socket,可以同时链接很多外部的地址。
sokiiya at 2008-5-26 12:39:27
厄=,=||||||||||
如何用一个socket?
难道用同一个 ACE_SOCK_Connector去连接吗?

[ 本帖最后由 sokiiya 于 2008-5-26 13:16 编辑 ]
winston at 2008-5-26 13:39:00
对啊。当然可以!
sokiiya at 2008-5-26 14:30:52
目前,把
        ACE_INET_Addr local_addr(8067);
        ACE_SOCK_Connector connector;
这两个都提成全局的了,可是还有同样的错误!
winston at 2008-5-26 16:16:44
不要用线程,顺序去链接不同的地址试试。
sokiiya at 2008-5-26 17:22:47
试了还是不行,socket不会在connect函数里吧。。。
winston at 2008-5-26 18:27:43
选择外部工具进行追踪。
TCPVIEW或者sniffer等,你看一下是否有SYN等消息。如果没有,则问题出在本地。