Page 1 of 1

How to get IP address for connection opened with host name?

Posted: Wed May 20, 2020 8:39 pm
by swhite
Hi

If I use OpenNetworkConnection() with a host name and not an IP Address is it possible to retrieve the IP address after the connection is made and if so how?

Thanks,
Simon

Re: How to get IP address for connection opened with host na

Posted: Wed May 20, 2020 11:28 pm
by salutcava
Rhello my friend !

Yes it is possible.
Try this out :

Code: Select all

InitNetwork()
hostnom.s="www.purebasic.com"
hostip.s=""
hostport.s = ""
cnx = OpenNetworkConnection(hostnom,80,#PB_Network_TCP|#PB_Network_IPv4)
socket = ConnectionID(cnx)

name.SOCKADDR_IN
namelen.i = SizeOf(SOCKADDR_IN)

Debug getpeername_(socket,@name.SOCKADDR_IN,@namelen)

hostip = IPString(name\sin_addr,#PB_Network_IPv4)
hostport = Str(name\sin_port)

Debug "Resultats : "
Debug "Port : " + hostport
Debug "IP : " + hostip
Bye, have fun my friend !

Re: How to get IP address for connection opened with host na

Posted: Thu May 21, 2020 2:54 pm
by swhite
Hi

I should have mentioned that I am using Linux.

Simon

Re: How to get IP address for connection opened with host na

Posted: Thu May 21, 2020 5:26 pm
by salutcava
Np my friend, here is your answer for linux :

http://man7.org/linux/man-pages/man2/getpeername.2.html

Have fun !

Re: How to get IP address for connection opened with host na

Posted: Thu May 21, 2020 8:13 pm
by swhite
This comes back with the wrong IP address so I assume that I have not configured the structures correctly. The IP address should be 64.191.45.45

Code: Select all

InitNetwork()
hostnom.s="bvddev20.vnkconsultinggroup.com"
hostip.s=""
hostport.s = ""
cnx = OpenNetworkConnection(hostnom,30000,#PB_Network_TCP|#PB_Network_IPv4)
socket = ConnectionID(cnx)

Structure in_addr
   s_addr.l
EndStructure

Structure sockaddr_in
   sin_family.w
   sin_port.c
   sin_addr.in_addr
   sin_zero.s[8]
EndStructure

name.SOCKADDR_IN
namelen.i = SizeOf(SOCKADDR_IN)

Debug getpeername_(socket,@name.SOCKADDR_IN,@namelen)

hostip = IPString(name\sin_addr,#PB_Network_IPv4)
hostport = Str(name\sin_port)

Debug "Resultats : "
Debug "Port : " + hostport
Debug "IP : " + hostip

Re: How to get IP address for connection opened with host na

Posted: Thu May 21, 2020 10:00 pm
by infratec
You forgot \s_addr and you have to swap the port bytes.

Code: Select all

Structure in_addr
  s_addr.l
EndStructure

Structure sockaddr_in
  sin_family.w
  sin_port.u
  sin_addr.in_addr
  sin_zero.a[8]
EndStructure


Define namelen.i, cnx
Define name.SOCKADDR_IN

InitNetwork()

cnx = OpenNetworkConnection("bvddev20.vnkconsultinggroup.com", 30000, #PB_Network_TCP|#PB_Network_IPv4)
socket = ConnectionID(cnx)

namelen = SizeOf(SOCKADDR_IN)

If getpeername_(socket, @name, @namelen) = 0
  Debug IPString(name\sin_addr\s_addr, #PB_Network_IPv4) + ":" + Str(ntohs_(name\sin_port))
EndIf

Re: How to get IP address for connection opened with host na

Posted: Thu May 21, 2020 10:16 pm
by infratec
And this works in windows and linux:

Code: Select all

EnableExplicit

Structure in_addr
  s_addr.l
EndStructure

Structure sockaddr_in_structure
  sin_family.w
  sin_port.u
  sin_addr.in_addr
  sin_zero.a[8]
EndStructure

Procedure.u ntohs(uword.u)
  ProcedureReturn uword << 8 | uword >> 8
EndProcedure

Define.i namelen, cnx, socket
Define name.sockaddr_in_structure

InitNetwork()

cnx = OpenNetworkConnection("bvddev20.vnkconsultinggroup.com", 30000, #PB_Network_TCP|#PB_Network_IPv4)
socket = ConnectionID(cnx)

namelen = SizeOf(sockaddr_in_structure)

If getpeername_(socket, @name, @namelen) = 0
  Debug IPString(name\sin_addr\s_addr, #PB_Network_IPv4) + ":" + Str(ntohs(name\sin_port))
EndIf
Something is wrong with the windows ntohs_() call :!:
Also the windows sockaddr_in structure is not usable in this case.

Re: How to get IP address for connection opened with host na

Posted: Fri May 22, 2020 2:14 pm
by swhite
Thank-you I missed that.

Simon
infratec wrote:You forgot \s_addr and you have to swap the port bytes.

Code: Select all

Structure in_addr
  s_addr.l
EndStructure

Structure sockaddr_in
  sin_family.w
  sin_port.u
  sin_addr.in_addr
  sin_zero.a[8]
EndStructure


Define namelen.i, cnx
Define name.SOCKADDR_IN

InitNetwork()

cnx = OpenNetworkConnection("bvddev20.vnkconsultinggroup.com", 30000, #PB_Network_TCP|#PB_Network_IPv4)
socket = ConnectionID(cnx)

namelen = SizeOf(SOCKADDR_IN)

If getpeername_(socket, @name, @namelen) = 0
  Debug IPString(name\sin_addr\s_addr, #PB_Network_IPv4) + ":" + Str(ntohs_(name\sin_port))
EndIf

Re: How to get IP address for connection opened with host na

Posted: Fri May 22, 2020 7:23 pm
by mk-soft
Works with macOS too.

First time save that :wink: