Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=getpeername">getpeername</a>(2)

1장. getpeername(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

소켓 지정번호 s 에 접속된 호스트정보를 알아오고 싶을때 사용한다.


1.1절. 사용법

#include <sys/socket.h>

int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
		


1.2절. 설명

때때로 네트웍으로 접근한 소켓 지정번호 s 를 이용하여 접근한 호스트의 정보를 알아오고 싶을때가 있을것이다. 이럴경우 사용할수 있으며 s 에는 소켓저정번호, *name 는 알아낸 호스트의 정보를 저장할 sockaddr 구조체, 마지막 *namelen 은 name이 가리키고 있는 영역의 크기를 나타낸다.


1.3절. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4절. 에러

다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.

EBADF

s 가 유효한 기술자가 아니다.

ENOTSOCK

s 가 소켓이 아닌 파일일경우

ENOTCONN

소켓이 연결되어 있지 않을경우

ENOBUFS

시스템에 연산을 위해서 이용할수 있는 자원이 부족할때


1.5절. 예제

#include <sys/types.h>

#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int state, client_len;

    struct sockaddr_in clientaddr, serveraddr, myaddr;


    // internet 기반의 스트림 소켓을 만들도록 한다. 
    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(12345);

    state = bind(server_sockfd , (struct sockaddr *)&serveraddr, 
            sizeof(serveraddr));
    if (state == -1)
    {
        perror("bind error : ");
        exit(0);
    }

    state = listen(server_sockfd, 5);
    if (state == -1)
    {
        perror("listen error : ");
        exit(0);
    }


    client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, 
                           &client_len);
    if (client_sockfd == -1)
    {
        perror("Accept error : ");
        exit(0);
    }

    // 바로여기
    getpeername(client_sockfd, (struct sockaddr *)&myaddr, &client_len);  

    printf("client ip is %d\n",myaddr.sin_port);
    printf("client port is %s\n",inet_ntoa(myaddr.sin_addr));
    close(client_sockfd);
    return 1;
}