- From: Thomas Dreibholz <dreibh AT exp-math.uni-essen.de>
- To: "Marjan Bozinovski" <marjanb AT cpk.auc.dk>, <rsplib-discussion AT sctp.de>
- Subject: Re: [RSPlib-Discusssion] ext_getpeername()
- Date: Mon Nov 4 10:37:00 2002
- List-id: RSPlib Discussions <rsplib-discussion.sctp.de>
- Organization: University of Essen, Institute for Experimental Mathematics
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Am Sonntag, 3. November 2002 13:19 schrieb Marjan Bozinovski:
>
Hi Thomas,
>
>
In my application I need to retrieve the IP address of the peer host to
>
which there is an existing connection identified by the socket number. As
>
far as I know there is a function in a kernel implementation of TCP, which
>
can accomplish this: getpeername(). The version of this function in the
>
socketapi is: ext_getpeername().
>
>
Thus, I call this function as follows:
>
>
ext_getpeername(socket_number, (struct sockaddr *) &saddr, (socklen_t *)
>
sizeof((struct sockaddr) saddr));
The function is defined as
int ext_getpeername(int sockfd, struct sockaddr* name, socklen_t* namelen).
namelen is a pointer to a variable of type socklen_t, which must contain the
size of the structure given by name before ext_getpeername() is called.
ext_getpeername() returns the real size in this variable.
You give the size directly as the parameter namelen (casted to socklen_t*).
ext_getpeername() interprets this size as address, therefore the segfault. Do
the following, and your program should work:
socklen_t saddr_size;
...
saddr_size = sizeof(saddr);
result = ext_getpeername(socket_number, (struct sockaddr *) &saddr,
&saddr_size);
>
where
>
>
socket_number - the socket descriptor of the SCTP association
>
saddr - a structure of type sockaddr_in
>
>
But, as a result of the execution of the function, I get segmentation fault
>
(core dumped).
>
>
Where do I make the mistake? Is there another way of finding out the peer
>
host name or IP address by only knowing the socket number.
For multi-homed environments, use sctp_getpaddrs() and sctp_getladdrs() to
obtain remote and local addresses. ext_getpeername() and ext_getsockname()
can only return one of the addresses!
Best regards
- --
=======================================================================
Dipl.-Inform. Thomas Dreibholz
University of Essen, Room ES210
Inst. for Experimental Mathematics Ellernstraße 29
Computer Networking Technology Group D-45326 Essen/Germany
- -----------------------------------------------------------------------
E-Mail:
dreibh AT exp-math.uni-essen.de
Homepage:
http://www.exp-math.uni-essen.de/~dreibh
=======================================================================
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see
http://www.gnupg.org
iD8DBQE9xjw732BbsHYPLWURAmR2AKDAb4JVG5RmjEhlul8AgYx0wzliTwCeKux+
2EJeymCB6nLGhuj9vu77GQo=
=Tr3E
-----END PGP SIGNATURE-----
Archive powered by MHonArc 2.6.19+.