c로 서버쪽 프로그램밍을 하고 있는데요. 소켓통신에서 접속한 클라이언트 아이피 어떻게 알 수 있나요? 궁금합니다.
요렇게.
struct sockaddr_in s_AcceptAddress; socklen_t s_AcceptAddressLength; int s_Socket, s_AcceptSocket; s_Socket =socket(....); if(s_Socket >= 0) { bind(....) listen(.....) do { s_AcceptAddressLength = sizeof(s_AcceptAddress); s_AcceptSocket = accept(s_Socket, (struct sockaddr *)(&s_AcceptAddress) &s_AcceptAddressLength); if(s_AcceptSocket >= 0) { fprintf(stdout, "Accept from %s:%d\n", inet_ntoa(s_AcceptAddress.sin_addr), ntohs(s_AcceptAddress.sin_port); close(s_AcceptSocket); } }while(1); }
아래와 같이 할 수 있습니다. sd의 값은 이미 연결된 소켓 디스크립터의 값 입니다.
unsigned long getclientipaddr(int sd) { unsigned long sip; struct sockaddr access;
int accesslen = sizeof(struct sockaddr);
//source IP를 알아낸다. if (getpeername(sd, (struct sockaddr *)&access, &accesslen) == 0) { sip = ((struct sockaddr_in *) &access)->sin_addr.s_addr;
}else{ perror("getpeername()"); sip = 0; } return sip; }
배울수 있어서 좋다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
요렇게.[code:1]struct sockaddr_in s_A
요렇게.
getpeername()을 이용하세요.
아래와 같이 할 수 있습니다.
sd의 값은 이미 연결된 소켓 디스크립터의 값 입니다.
unsigned long getclientipaddr(int sd)
{
unsigned long sip;
struct sockaddr access;
int accesslen = sizeof(struct sockaddr);
//source IP를 알아낸다.
if (getpeername(sd, (struct sockaddr *)&access, &accesslen) == 0) {
sip = ((struct sockaddr_in *) &access)->sin_addr.s_addr;
}else{
perror("getpeername()");
sip = 0;
}
return sip;
}
배울수 있어서 좋다.
댓글 달기