반응형

클라이언트에서 Port Number

  • TCP 소켓 : connect() 호출 성공한 후에 배정
  • UDP 소켓 : sendto() 함수가 성공한 후에 배정 (첫 번째 메시지를 보내는 함수)

 

사용 예제

// -----------------------------------
// 파일명:port_number.c
// 기 능 :시스템이 자동으로 배정한 포트번호를 출력하는 프로그램
// 컴파일:gcc port_number.c -o port_number
// 사용법:./port_number
// -----------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define MSG "Test Message"

int main(){
    int sd1, sd2;
    int addrlen;
    struct sockaddr_in servaddr, cliaddr;   // 소켓주소 구조체
    unsigned short port1, port2;            // 포트 번호

    // 소켓주소 구조체 초기화
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(7);

    sd1 = socket(PF_INET, SOCK_STREAM, 0);
    sd2 = socket(PF_INET, SOCK_DGRAM, 0);

    // TCP 소켓의 포트번호 얻기
    if(connect(sd1, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
        perror("connect fail");
        exit(1);
    }
    getsockname(sd1, (struct sockaddr*)&cliaddr, &addrlen);
    port1 = ntohs(cliaddr.sin_port);

    // UDP 소켓의 포트번호 얻기
    sendto(sd2, MSG, strlen(MSG), 0,
            (struct sockaddr*)&servaddr, sizeof(servaddr));
    getsockname(sd2, (struct sockaddr*)&cliaddr, &addrlen);
    port2 = ntohs(cliaddr.sin_port);

    printf("스트림  소켓 포트번호 = %d\n", port1);
    printf("데이터그램  소켓 포트번호 = %d\n", port2);
    close(sd1);
    close(sd2);

    return 0;
}

 

실행 결과

$./port_number

스트림        소켓 포트번호 = 58895
데이터그램 소켓 포트번호 = 32771

 

반응형