[질문]UDP 통신에서 접속하는 클라이언트의 정보 얻기..

leolo의 이미지

말그대로, UDP 통신에서 접속하는 클라이언트이 IP와 PORT 번호를
알고자 합니다. 여기서, TCP에서와 같이
gethostbyaddr을 사용하면 되는지요..
간단한 예제가 있으면 알려주세요..

leolo의 이미지

struct sockaddr_in adr; 


.......... 
        if(FD_ISSET(bk, &read_fd)) 
        { 
            if((r = recvfrom(bk, dgram, sizeof(dgram), 0, (struct sockaddr *)&adr, &x)) < 0) 
            { 
                err("recvfrom() failed. %s(%d)\n", strerror(errno), errno); 
            } 

            header = (msg_head *)dgram; 
            switch(header->type) 
            { 
                case REQ_CLI_LOGIN : 
                    { 
                        lgn_req = (login_req*)dgram; 
                        
                        // get IP address 
                        hp = gethostbyaddr((char*)&(adr.sin_addr.s_addr), sizeof(adr.sin_addr.s_addr), AF_INET); 
                        if(!hp) 
                        { 
                            err("error\n"); 
                        } 
                        else 
                        { 
                            dbg("success IP[%s]\n", inet_ntoa(adr.sin_addr)); 
                        } 
                        lgn_res->ack = 0x01; 
                        if(( s = sendto(bk, dtfmt, sizeof(dtfmt), 0, (struct sockaddr *)&adr, x)) < 0) 
                        { 
                            err("sendto() failed. %s(%d)\n", strerror(errno), errno); 
                        } 

                    } 
                    break; 
                default : 
                    dbg("unkwon type 0x%x\n", header->type); 
            } 
        } 
    } 


이렇게 하면 같은 호스트에서 서버, 클라이언트를 돌리면 되는데,
다른 호스트에서 서버, 클라이언트 돌리면 안됩니다..

실력이 있으면 삶이 편하다... 영차 영차...

indie의 이미지

printf("ip:%s\n", inet_ntoa(adr.sin_addr);

이렇게 하면 될거 같은데...

집에나 갈까?

kslee80의 이미지

IP 와 Port 넘버를 알아보는데 gethostbyaddr 을 쓸 필요는 없습니다.
gethostbyaddr 은 IP 어드레스를 가지고 해당 IP 의 호스트 네임을
Reverse-lookup 하는 함수죠.
(즉, DNS 를 이용합니다.)

recvfrom() 의 4번째 아규먼트인 struct sockaddr * 에 접속한 클라이언트의
IP 와 Port 넘버가 들어가 있습니다. 물론 network byte order 로 들어있죠.

IP 는 먼저 답변하신 분 말씀대로 inet_ntoa(adr.sin_addr) 로 얻으시면 됩니다.
(실제 코드상에도 이 함수가 보이는군요)
Port 는 ntohs(adr.sin_port) 로 얻을수 있죠.

leolo의 이미지

저가 정신이 없죠..

실력이 있으면 삶이 편하다... 영차 영차...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.