Hi all,
I solve this problem, but I am sure about the root cause...
The problem seems to be getaddrinfo doesn't return correct info.
As the following codes indicates, I remove AI_ADDRCONFIG in ai_flags.
C++ clients is then able to connect to php server.
TSocket.cpp:
...
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
//hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
hints.ai_flags = AI_PASSIVE;
sprintf(port, "%d", port_);
error = getaddrinfo(host_.c_str(), port, &hints, &res0);
...
The man page said:
If hints.ai_flags includes the AI_ADDRCONFIG flag, then IPv4
addresses are returned in the list pointed to by res only if the local
system has
at least one IPv4 address configured, and IPv6 addresses are only
returned if the local system has at least one IPv6 address configured.
However, my system got both IPv4 and IPv6 address.
This should not be a problem....
eth0 Link encap:Ethernet HWaddr 00:13:d4:e4:65:ed
inet addr:192.168.1.25 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::213:d4ff:fee4:65ed/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:821282 errors:0 dropped:0 overruns:0 frame:0
TX packets:958548 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:122517133 (122.5 MB) TX bytes:253954816 (253.9 MB)
Interrupt:17 Base address:0xe000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:75224 errors:0 dropped:0 overruns:0 frame:0
TX packets:75224 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:23526262 (23.5 MB) TX bytes:23526262 (23.5 MB)
Anyway, the problem solved.
It would be fantastic if I could know the root cause.
Thanks,
--
Keene Tsai (蔡承翰)
http://keene.twbbs.org
On Fri, Nov 18, 2011 at 4:38 AM, Cheng-Han Tsai <[email protected]>wrote:
> Hi all,
>
> I am not sure if this is a bug.
> I wrote a PHP standalone server (w/ TSimpleServer) by modifying php
> tutorial codes.
> The tutorial version of php client could connect to the standalone php
> server successfully.
> All execution results are correc as expected.
> However, c++ client can't even establish the connection.
> The error message is listed:
>
> Thrift: Fri Nov 18 04:13:36 2011 TSocket::open() connect() <Host:
> localhost Port: 9090>Connection refused
> Thrift: Fri Nov 18 04:13:36 2011 TSocket::open() connect() <Host:
> localhost Port: 9090>Connection refused
> ERROR: connect() failed: Connection refused
>
> Telnet shows port 9090 is available, but c++ client still have problem to
> connect.
> I also confirmed that c++ server/client works perfectly in the same
> environment.
> Therefore, I am thinking if the implementation of C and PHP version have
> compatibility problem
>
> The main implementation of my php standalone server is listed below.
>
> $handler = new CalculatorHandler();
> $processor = new CalculatorProcessor($handler);
> $transport = new TServerSocket();
> $i_transportFactory = new TTransportFactory();
> $o_transportFactory = new TTransportFactory();
> $i_protocolFactory = new TBinaryProtocolFactory();
> $o_protocolFactory = new TBinaryProtocolFactory();
>
> $simple_server = new TSimpleServer($processor, $transport,
> $i_transportFactory, $o_transportFactory, $i_protocolFactory,
> $o_protocolFactory);
>
> print "server to start\n";
> $simple_server->serve();
>
>
> Any idea?
>
>
> Best Regards,
>
> --
> Keene Tsai (蔡承翰)
> http://keene.twbbs.org
>