[Users] TCP socket problem
Klaus Darilion
klaus.mailinglists at pernau.at
Wed Aug 17 17:46:14 CEST 2005
Klaus Darilion wrote:
> Bogdan-Andrei Iancu wrote:
> > I know no way to bind only to an address but letting the kernel to
>
>> choose the port (a portable solution)......
>
>
> What about setting the port to 0? I tried it and it works on Linux. Do
> you think that this does not work on other OS?
I reviewed the source code of netcat (which is quiet portable) and
netcat also does it this way:
socket()
bind()
connect()
When binding, the "dynamic" part (address or port) will be set to 0.
I think we should also implement this in openser. If openser listen only
on one interface the bind logic is simple: take this IP address.
If openser listens to multiple IP addresses we can just use the first IP
address, or we can have a logic which chooses the best IP address (e.g.
the IP address, on which the request was received).
regards
klaus
>
> regards
> klaus
>
>>
>> So, I would say either change the interface order, either the filter
>> on the GW ....for the moment....
>>
>> regards,
>> bogdan
>>
>> Klaus Darilion wrote:
>>
>>> My server configuration:
>>> # ifconfig
>>> eth0 Link encap:Ethernet HWaddr 00:0B:DB:90:FA:3F
>>> inet addr:x.x.32.80 Bcast:x.x.32.127
>>>
>>> eth0:3 Link encap:Ethernet HWaddr 00:0B:DB:90:FA:3F
>>> inet addr:x.x.32.83 Bcast:x.x.32.127
>>>
>>> eth0 .80 is the default interface, openser listens on .83
>>> This is done by putting
>>> listen=x.x.32.83:5060
>>> into openser.cfg
>>>
>>> openser binds to .83, verified by # netstat -anp|grep 5060
>>> tcp 0 0 x.x.32.83:5060 0.0.0.0:* LISTEN 1390/openser
>>> udp 0 0 x.x.32.83:5060 0.0.0.0:* 1390/openser
>>>
>>> Then I forwarded a message to a GW using TCP (lcr + t_relay):
>>> (without force_send_socket)
>>>
>>>
>>> DEBUG: reply sent out. buf=0x8134330: SIP/2.0 1...,
>>> shmem=0x40680a90: SIP/2.0 1
>>> DEBUG: _reply_light: finished
>>> DEBUG: mk_proxy: doing DNS lookup...
>>> build_req_from_req: id added: <;i=1>, rcv proto=2
>>> parse_headers: flags=1000
>>> parse_headers: flags=1000
>>> parse_headers: flags=ffffffffffffffff
>>> clen_builder: content-length: 290 (290)
>>> check_via_address(x.x.33.3, 10.10.0.50, 0)
>>> tcp_send: no open tcp connection found, opening new one
>>> ERROR: tcp_blocking_connect: SO_ERROR (113) No route to host
>>> ERROR: tcpconn_connect: tcp_blocking_connect failed
>>> ERROR: tcp_send: connect failed
>>> msg_send: ERROR: tcp_send failed
>>> ERROR: t_forward_nonack: sending request failed
>>>
>>>
>>> tcp_blocking_connect fails (the error message is a little bit
>>> misleading and caused by an ICMP error), as the GW accepts SIP only
>>> from .83, and not from .80: In the following tcpdump you see that
>>> openser tries to establish the TCP connection from .80 instead of .83:
>>>
>>> IP x.x.32.80.41580 > x.x.33.4.5060: S
>>> IP x.x.33.4 > x.x.32.80: icmp 36: host x.x.33.4 unreachable - admin
>>> prohibited filter
>>>
>>>
>>> Any hints are appreciated.
>>>
>>> Conclusion: openser sends .80 although it is bound to .83.
>>>
>>> regards
>>> Klaus
>>>
>>>
>>> Bogdan-Andrei Iancu wrote:
>>>
>>>> Hi Klaus,
>>>>
>>>> not sure what you mean by "default interface", but here are some
>>>> facts after digging thought the code:
>>>>
>>>> 1) when doing normal fwd (no force) on tcp, it will be used the
>>>> first TCP socket from the listen list; there is a funny comment from
>>>> Andrei in get_send_socket() function "on tcp just use the "main
>>>> address", we don't really now the sending address (we can find it
>>>> out, but we'll need also to see if we listen on it, and if yes on
>>>> which port -> too complicated"
>>>>
>>>> 2) if force_send_socket is used on tcp...depends.... do you get the
>>>> debug message:
>>>> "get_send_socket: force_send_socket of different proto(1)!" ??
>>>> are you using t_relay() after??
>>>> what are the listening interfaces (all, udp and tcp)?
>>>>
>>>> regards,
>>>> bogdan
>>>>
>>>> Klaus Darilion wrote:
>>>>
>>>>> Hi!
>>>>>
>>>>> I've configured openser to listen on a ceratin IP address.
>>>>>
>>>>> listen=83.xxx.32.83:5060
>>>>>
>>>>> Nevertheless, if t_relay tries to sned via TCP, openser opens the
>>>>> TCP connection from the default interface.
>>>>>
>>>>> I also tried
>>>>> force_send_socket(tcp:83.xxx.32.83:5060);
>>>>> with the same results.
>>>>>
>>>>> Are there any known problems? IMO openser should always use the IP
>>>>> address on which it listens.
>>>>>
>>>>> regards
>>>>> klaus
>>>>>
>>>>> _______________________________________________
>>>>> Users mailing list
>>>>> Users at openser.org
>>>>> http://openser.org/cgi-bin/mailman/listinfo/users
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
> _______________________________________________
> Users mailing list
> Users at openser.org
> http://openser.org/cgi-bin/mailman/listinfo/users
>
>
More information about the Users
mailing list