Network/Network [μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°] SO_KEEPALIVE μ˜΅μ…˜ μ‚¬μš©λ²•/SO_LINGER μ˜΅μ…˜ μ‚¬μš©λ²•
  • 728x90
    λ°˜μ‘ν˜•

     

     

     

    SO_KEEPALIVE μ˜΅μ…˜ κ°œμš”

    πŸ“Œ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ„€νŠΈμ›Œν¬ 연결을 닀루닀 보면, μ—°κ²°μ˜ μ•ˆμ •μ„±κ³Ό 신뒰성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 가지 μ˜΅μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έ μ€‘μ—μ„œλ„ SO_KEEPALIVE μ˜΅μ…˜μ€ 특히 μ—°κ²°μ˜ ν™œμ„± μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 데 μœ μš©ν•œ μ˜΅μ…˜μž…λ‹ˆλ‹€. 이 μ˜΅μ…˜μ€ 연결이 λŠμ–΄μ‘Œμ„ λ•Œ 이λ₯Ό μ‹ μ†ν•˜κ²Œ κ°μ§€ν•˜κ³  λŒ€μ‘ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

     

    SO_KEEPALIVE μ˜΅μ…˜μ€ TCP μ†ŒμΌ“μ—μ„œ μ‚¬μš©λ˜λ©°, 연결이 일정 μ‹œκ°„ λ™μ•ˆ ν™œλ™μ΄ 없을 λ•Œ λ„€νŠΈμ›Œν¬ 문제λ₯Ό κ°μ§€ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이 μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•˜λ©΄, μ‹œμŠ€ν…œμ€ μΌμ •ν•œ 주기둜 μƒλŒ€λ°©μ—κ²Œ "Keep-Alive" λ©”μ‹œμ§€λ₯Ό 보내 연결이 μ—¬μ „νžˆ ν™œμ„± μƒνƒœμΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.

     

    🎯 ν•¨κ»˜ μ‚¬μš©λ˜λŠ” μ˜΅μ…˜

    • TCP_KEEPIDLE: 이 μ˜΅μ…˜μ€ Keep-Alive λ©”μ‹œμ§€λ₯Ό 보내기 μ‹œμž‘ν•˜κΈ° 전에 연결이 유휴 μƒνƒœλ‘œ μœ μ§€λ˜λŠ” μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€.
    • TCP_KEEPINTVL: 이 μ˜΅μ…˜μ€ Keep-Alive λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 간격을 μ„€μ •ν•©λ‹ˆλ‹€.
    • TCP_KEEPCNT: 이 μ˜΅μ…˜μ€ Keep-Alive λ©”μ‹œμ§€μ˜ μ΅œλŒ€ 횟수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. 이 횟수λ₯Ό μ΄ˆκ³Όν•˜λ©΄ 연결이 μ’…λ£Œλ©λ‹ˆλ‹€.

     

    πŸ”” 예) SO_KEEPALIVE μ˜΅μ…˜μ˜ κ°„λ‹¨ν•œ 예제

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/tcp.h>
    #include <unistd.h>
    
    int main() {
    	// Enable SO_KEEPALIVE option
        int optval = 1;
    	// Additional options
        int keepidle = 60; // 60 seconds
        int keepintvl = 5; // 5 seconds
        int keepcnt = 3;   // 3 keepalive probes
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
            perror("Error in socket creation");
            return 1;
        }
        
        if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) {
            perror("Error in setsockopt");
            return 1;
        }
        
        if (setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle)) < 0 ||
            setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl)) < 0 ||
            setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt)) < 0) {
            perror("Error in setting additional options");
            return 1;
        }
    
        // Use the socket...
    
        close(sockfd);
        return 0;
    }

     

     

     

    SO_LINGER μ˜΅μ…˜ κ°œμš”

    πŸ“Œ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” λ„€νŠΈμ›Œν¬ ν†΅μ‹ μ˜ μ•ˆμ •μ„±κ³Ό 신뒰성을 ν™•λ³΄ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ ν™œμš©ν•©λ‹ˆλ‹€. κ·Έ 쀑 ν•˜λ‚˜μΈ SO_LINGER μ˜΅μ…˜μ€ 연결을 μ’…λ£Œν•  λ•Œμ˜ λ™μž‘μ„ μ œμ–΄ν•˜μ—¬ νŠΉμ • μƒν™©μ—μ„œμ˜ λ™μž‘μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    SO_LINGER μ˜΅μ…˜μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„ , μ†ŒμΌ“μ΄ μ–΄λ–»κ²Œ μ’…λ£Œλ˜λŠ”μ§€μ— λŒ€ν•œ 이해가 ν•„μš”ν•©λ‹ˆλ‹€. 기본적으둜 μ†ŒμΌ“μ„ 닫을 λ•Œ, 컀널은 솑/μˆ˜μ‹  버퍼에 λ‚¨μ•„μžˆλŠ” 데이터λ₯Ό λͺ¨λ‘ μ „μ†‘ν•œ 후에 μ†ŒμΌ“μ„ μ’…λ£Œν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄λ•Œ SO_LINGER μ˜΅μ…˜μ„ μ„€μ •ν•˜λ©΄, μ†ŒμΌ“μ„ 닫을 λ•Œμ˜ λ™μž‘μ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    SO_LINGER μ˜΅μ…˜μ€ linger ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€μ •λ©λ‹ˆλ‹€. linger κ΅¬μ‘°μ²΄λŠ” λ‹€μŒκ³Ό 같은 정보λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

     

    • l_onoff : linger μ˜΅μ…˜μ„ μ‚¬μš©ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” ν”Œλž˜κ·Έμž…λ‹ˆλ‹€.
    • l_linger : linger μ˜΅μ…˜μ„ μ‚¬μš©ν•  경우 μ†ŒμΌ“μ„ 닫을 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λŠ” μ‹œκ°„μ„ μ„€μ •ν•©λ‹ˆλ‹€. 이 값은 초 λ‹¨μœ„λ‘œ μ„€μ • λ©λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, I_onoffλ₯Ό 1둜 μ„€μ •ν•˜κ³ , l_lingerλ₯Ό 0으둜 μ„€μ •ν•˜λ©΄, μ†ŒμΌ“μ„ 닫을 λ•Œ λ‚¨μ•„μžˆλŠ” 데이터λ₯Ό λͺ¨λ‘ μ „μ†‘ν•˜λ € μ‹œλ„ν•˜μ§€λ§Œ, λ§Œμ•½ 솑신 큐가 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ μ¦‰μ‹œ 연결을 μ’…λ£Œν•©λ‹ˆλ‹€. λ°˜λ©΄μ— l_lingerλ₯Ό μ–‘μ˜ κ°’μœΌλ‘œ μ„€μ •ν•˜λ©΄, ν•΄λ‹Ή μ‹œκ°„ λ™μ•ˆ 큐가 λΉ„μ›Œμ§ˆ λ•ŒκΉŒμ§€ λŒ€κΈ°ν•©λ‹ˆλ‹€.

     

    πŸ”” 예) μ•„λž˜λŠ” Cμ½”λ“œ μ˜ˆμ œμž…λ‹ˆλ‹€.

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/tcp.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
     	struct linger so_linger;
        so_linger.l_onoff = 1;
        so_linger.l_linger = 0; // or any desired value in seconds
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
            perror("Error in socket creation");
            return 1;
        }
    
        if (setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)) < 0) {
            perror("Error in setsockopt");
            return 1;
        }
    
        // Use the socket...
    
        close(sockfd);
        return 0;
    }

     

     

     

     

    728x90
    λ°˜μ‘ν˜•

    'Network > Network' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    TCP μ†ŒμΌ“ μ˜΅μ…˜ SO_REUSEADDR  (0) 2019.01.23
μƒλ‹¨μœΌλ‘œ