from:http://blog.sunshow.net/2009/07/get-client-ip-from-socket/
有两种方法,一种是在accept的时候获取,一种是通过getpeername获取
#include
<
sys/socket.h
>
int accept ( int socket , struct sockaddr * restrict address ,
socklen_t * restrict address_len ) ;
int getpeername ( int socket , struct sockaddr * restrict address ,
socklen_t * restrict address_len ) ;
int accept ( int socket , struct sockaddr * restrict address ,
socklen_t * restrict address_len ) ;
int getpeername ( int socket , struct sockaddr * restrict address ,
socklen_t * restrict address_len ) ;
两者区别主要在取IP的fd不一样,前者是在监听的fd,后者是在连接建立的fd
struct
sockaddr_in
addr
;
socklen_t addr_len ;
int32_t listen_fd , sock_fd ;
/* create listening port */
addr_len = sizeof ( addr ) ;
memset ( & addr , 0 , addr_len ) ;
sock_fd = accept ( listen_fd , ( struct sockaddr * ) & addr , & addr_len ) ;
printf ( " %d \ n " , addr . sin_addr . s_addr ) ;
memset ( & addr , 0 , addr_len ) ;
getpeername ( sock_fd , ( struct sockaddr * ) & addr , & addr_len ) ;
printf ( " %d \ n " , addr . sin_addr . s_addr ) ;
socklen_t addr_len ;
int32_t listen_fd , sock_fd ;
/* create listening port */
addr_len = sizeof ( addr ) ;
memset ( & addr , 0 , addr_len ) ;
sock_fd = accept ( listen_fd , ( struct sockaddr * ) & addr , & addr_len ) ;
printf ( " %d \ n " , addr . sin_addr . s_addr ) ;
memset ( & addr , 0 , addr_len ) ;
getpeername ( sock_fd , ( struct sockaddr * ) & addr , & addr_len ) ;
printf ( " %d \ n " , addr . sin_addr . s_addr ) ;
当然这种长整型格式的IP不一定是我们想要的,可以通过inet_ntoa转换
#include
<
arpa/inet.h
>
in_addr_t inet_addr ( const char * cp ) ;
char * inet_ntoa ( struct in_addr in ) ;
in_addr_t inet_addr ( const char * cp ) ;
char * inet_ntoa ( struct in_addr in ) ;
printf
(
"
%s
\
n
"
,
inet_ntoa
(
addr
))
;