min's devlog
소켓옵션 종류 본문
소켓 옵션 종류
SO_KEEPALIVE
- TCP 연결이 정상적으로 지속되고 있는지 주기적으로 확인하는 기능이다.
- 이 옵션이 세트되어 있으면, TCP는 확인시간(예:2시간)동안 데이터 송수신이 없을 때, TCP연결이 살아있는지 질문(keep alive prove)을 전송한다.
- Keep Alive Prove를 보내면 돌아오는 세 가지 응답
- 상대방이 ACK를 보낸다 : TCP 연결이 정상적!
- 상대방이 RST 에러를 보낸다(reset). : 상대방 호스트가 꺼진 후 재부팅 된 상태이다. TCP는 소켓을 닫으며 에러코드는 ECONNRESET
- 아무 응답이 없다 : 질문을 8번정도 더 보내본 후 연결 종료-ETIMEDOUT
SO_LINGER
- close() 호출시에는 (닫기) 송신버퍼에 데이터가 남아 있어도 close()가 즉시 리턴되고,
TCP는 이 데이터를 모두 전송한 후 실제 연결을 종료한다. (FIN/ACK 수행 후 리턴)
- close() 함수가 리턴한 시점에서 모든 데이터가 전송된 것을 보장하진 않는다.
- 그래서 SO_LINGER 옵션을 써서 일정 시간동안 조금 기다리도록 만든다.
- close() 호출 후 상대방에서 정상적으로 종료되었는지 확인하기 위해 사용한다.
- close()는 지정한 linger 시간 동안 또는 정상 종료시까지 블록됨
- 정상 종료전에 linger시간이 타임아웃되면 ETIMEDOUT 에러 발생
close()ㅡㅡㅡㅡㅡ(linger검사중,close블록)ㅡㅡㅡㅡ>리턴
- 4-way handshake (half close)
: FIN,ACK,FIN,ACK 순서로 동작하는데, 호스트 A가 B로 데이터 전송 후 close()를 호출한 시점에서 B가 모든 데이터를 읽었다고 확신할 수 없다
-shutdown() : 이용하면 상대방이 FIN을 보낼때까지 기다린다.
int shutdown(int s,int how); //s:소켓번호
-how
- SHUT_WR : 송신 스트림만 닫음
- SHUT_RD : 수신 스트림만 닫음
- SHUT_RDWR : 송수신 스트림을 모두 닫음(close())
-상대방이 FIN을 보낼 때까지 기다리는 코드
1: write(sock, buf, size);
2: shutdown(sock, SHUT_WR);
3: while(read(sock, buf, size)>0);
4: shutdown(sock, SHUT_RD);
SO_RCVBUF, SO_SNDBUF
- receive 버퍼와 send버퍼
- 접속 설정 이후에는 사용할 수 없다. (connect():접속설정)
: 클라이언트는 connect()호출 이전에 설정
SO_REUSEADDR re use addr
int set = 1;
setsockop(udp_sock1, SOL_SOCKET, SO_RESUEADDR, (void*)&set, sizeof(int));
- 동일한 소켓주소 (IP주소+포트번호)를 여러 프로세스 또는 한 프로세스 내의 여러 소켓에서 중복 사용을 허용
(기본적으로 한 호스트 내에서는 같은 포트번호의 중복 사용이 불가능하다)
-소켓주소 재사용 옵션이 필요한 경우? (포트번호 재사용)
- TIMED-WAIT 상태에서의 주소 재사용
- 자식 프로세스가 서버인경우 : (이름바꾸는옵션인)bind() 호출 이전에 설정해야함
- 멀티홈 서버의 경우
- 완전 중복 바인딩
SO_OOBINLINE (out of band inline)
- out of band나 일반 버퍼나 우선순위들을 동등한 순서로 처리하겠다
SO_RCVLOWAT, SO_SNDLOWAT (receive send)
- 송수신 버퍼의 최소량 설정 옵션
SO_DONTROUTE
- 패킷은 어디로 갈지 모르지만 경로를 미리 정할 수도 있다
- 이것을 금지시킴
- 데이터그램 송신시에 시스템이 배정하는 라우팅 경로를 사용하지 않도록 함
- 이것들을 많이 쓸 기회는 없을 것이지만, 다양한 네트워크 프로그램 사용자로서 매우 유용할 것 같다.
'Linux > TCP IP Socket Programming' 카테고리의 다른 글
멀티캐스트 프로그래밍 (0) | 2021.03.28 |
---|---|
소켓 옵션 종류(2) (0) | 2021.03.28 |
소켓과 소켓 옵션 (0) | 2021.03.27 |
fork()와 wait() (0) | 2021.03.27 |
어셈블된 코드 (0) | 2021.03.26 |