소켓통신에서 접속한 클라이언트 아이피 어떻게 알 수 있나요?

pogs의 이미지

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);


}
iyouhe의 이미지

아래와 같이 할 수 있습니다.
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;
}

배울수 있어서 좋다.