π μμΌ νλ‘κ·Έλλ°μμ λ€νΈμν¬ μ°κ²°μ λ€λ£¨λ€ 보면, μ°κ²°μ μμ μ±κ³Ό μ λ’°μ±μ μ μ§νκΈ° μν΄ μ¬λ¬ κ°μ§ μ΅μ μ μ¬μ©ν΄μΌ ν©λλ€. κ·Έ μ€μμλ SO_KEEPALIVE μ΅μ μ νΉν μ°κ²°μ νμ± μνλ₯Ό μ μ§νλ λ° μ μ©ν μ΅μ μ λλ€. μ΄ μ΅μ μ μ°κ²°μ΄ λμ΄μ‘μ λ μ΄λ₯Ό μ μνκ² κ°μ§νκ³ λμν μ μλλ‘ λμμ€λλ€.
SO_KEEPALIVE μ΅μ μ TCP μμΌμμ μ¬μ©λλ©°, μ°κ²°μ΄ μΌμ μκ° λμ νλμ΄ μμ λ λ€νΈμν¬ λ¬Έμ λ₯Ό κ°μ§νλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄ μ΅μ μ νμ±ννλ©΄, μμ€ν μ μΌμ ν μ£ΌκΈ°λ‘ μλλ°©μκ² "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 μ΅μ μ 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;
}
TCP μμΌ μ΅μ SO_REUSEADDR (0) | 2019.01.23 |
---|