[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 sr-users mailing list