251008

lililllilillll·2025년 10월 8일

개발 일지

목록 보기
318/350

✅ 한 것들


  • 윤성우의 열혈 TCP/IP 소켓 프로그래밍
  • 프로그래머스
  • R&D : Jenkins, Flat Kit


📖 윤성우의 열혈 TCP/IP 소켓 프로그래밍


Chapter 08 도메인 이름과 인터넷 주소

08-1 Domain Name System

도메인 이름 : IP 주소의 별칭

  • DNS 서버가 IP 주소로 변환시켜준다
  • 모든 컴퓨터에는 디폴트 DNS 서버의 주소가 등록돼있다
  • 디폴트 DNS 서버는 모르면 다른 DNS 서버에 물어본다

08-2 IP주소와 도메인 이름 사이의 변환

gethostbyname() : 도메인 이름 문자열로부터 IP 주소 정보 얻는다

  • hostent라는 구조체가 반환된다
    • h_name : 공식 도메인 이름
    • h_aliases : 공식 도메인 이름 외에 접속할 수 있는 다른 이름
    • h_addrtype : h_addr_list로 반환된 IP 주소의 주소체계 정보
    • h_length : IP주소의 크기정보
    • h_addr_list : 도메인 이름에 대한 IP주소가 정수 형태로 반환됨
  • 도메인 이름을 IP로 변환할 땐 반환 정보 중 h_addr_list만 신경써도 된다
	host=gethostbyname(argv[1]);
	if(!host)
		error_handling("Gethost... error");

	printf("Official name: %s \n", host->h_name);
	for(i=0; host->h_aliases[i]; i++)
		printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);
	printf("Address type: %s \n", 
		(host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
	for(i=0; host->h_addr_list[i]; i++)
		printf("IP addr %d: %s \n", i+1,
     		inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));

gethostbyname 함수 활용 예시

  • h_addr_list는 문자열 포인터 배열이고,
  • 그 배열이 실제 가리키는 건 in_addr 구조체 변수 주소값
  • IPv6 기반도 저장하기 위해 char형으로 선언한 것
  • void형 포인터가 표준화되기 전이라 char형 포인터 쓴 것

gethostbyaddr : IP주소를 이용해서 도메인 정보를 얻는다

Chapter 09 소켓의 다양한 옵션

09-1 소켓의 옵션과 입출력 버퍼의 크기

소켓의 특성을 조회하거나 변경할 수 있다

  • IPPROTO_IP : IP 프로토콜 관련
  • IPPROTO_TCP : TCP 프로토콜 관련
  • SOL_SOCKET : 소켓 관련 일반적 옵션

getsockopt() : 옵션 확인
setsockopt() : 옵션 변경

  • SO_TYPE : 소켓의 타입. 소켓 생성 이후 변경 불가.
  • SO_RCVBUF : 입력 버퍼의 크기
  • SO_SNDBUF : 출력 버퍼의 크기
  • 입출력 버퍼의 크기는 100% 요구대로 반영되지 않는다

09-2 SO_REUSEADDR

클라가 먼저 연결을 끊으면 서버 재실행 문제 없다.
하지만 서버가 먼저 연결을 끊으면 (프로그램 종료하면) 서버 재실행 문제 생긴다.
3분 정도 기다려야 재실행 된다.
서버가 먼저 연결 종료를 요청핶기 때문에, 아직 TCP의 Time-wait 상태에 있기 때문이다.
클라 소켓은 PORT가 임의로 할당되기 때문에, Time-wait를 신경쓰지 않아도 된다.

  • 서버 먼저 연결 종료 : 3분 간 재실행 안됨
    • 연결 종료 요청한 쪽은 Time-wait 상태로 들어가기 때문
    • FIN 보낸 후 ACK 오는지 확인하기 위해 Time-wait
  • 클라 먼저 연결 종료 : 문제 없음
    • 클라 소켓은 PORT가 임의로 할당되어 문제 발생 안 함
  • 서버 즉시 재실행 해야 하는데 Time-wait하고 있으면 곤란
  • FIN 보냈는데 클라가 못 받으면 무한 대기해버려서 더 곤란
  • SO_REUSEADDR 상태 변경하면 사용중인 PORT를 새로운 소켓에 할당 가능
	optlen=sizeof(option);
	option=TRUE;
	setsockopt(serv_sock,SOL_SOCKET,SO_REUSEADDR,(void*)&option, optlen);

09-3 TCP_NODELAY

Nagle 알고리즘

  • 이전에 보낸 데이터에 대한 ACK 받아야만 다음 데이터 전송
  • 용량 큰 파일 보낼 때는 좋지 않다
    • 파일 데이터 출력 버퍼로 넣는 작업은 빠르게 완료됨
    • 따라서 Nagle 적용 안해도 출력버퍼 거의 꽉 채운 상태에서 패킷 전송
    • ACK를 안 기다리고 연속 전송하면 전송 속도 향상


⚔️ 프로그래머스


  • 야근 지수

등굣길

int solution(int m, int n, vector<vector<int>> puddles) {
    vvl grid = vvl(n+1,vl(m+1));
    for(vi puddle : puddles) 
    {
        grid[puddle[1]][puddle[0]] = -1;
    }
    grid[n][m]=1;
    for(int i=n; 0<i; i--)
    {
        for(int j=m; 0<j; j--)
        {
            if(grid[i][j]==-1) continue;
            if(grid[i][j-1]!=-1)
            {
                grid[i][j-1]+=grid[i][j];
                grid[i][j-1]%=1000000007;
            }
            if(grid[i-1][j]!=-1)
            {
                grid[i-1][j]+=grid[i][j];
                grid[i-1][j]%=1000000007;
            }
        }
    }
    return grid[1][1]%1000000007;
}

문제 조건 좌표가 vector 기준이 아니라 xy좌표축 기준이었다.



🛠️ R&D


Jenkins

설치 오류

  • java 찾아달라고 징징 : 아무 java 말고 버전 맞는 jdk 설치 후에 program files에서 java 폴더 경로 지정

Flat Kit

매뉴얼 읽기



profile
너 정말 **핵심**을 찔렀어

0개의 댓글