반응형
socket() : 소켓 개설
- socket()으로 소켓 개설할 시 TCP, UDP 소켓을 선택 (TCP > SOCK_STREAM)
- 소켓 만들 때, Transport Protocol만 지정
- 소켓을 이용한 통신 프로그램 : 사용할 Transport Protocol, 자신 IP/Port, 상대방 IP/Port 필요
- 여기에선 그중에서 Transport Protocol만 지정
- 응용 프로그램 : Protocol 지정, socket() 호출
소켓 인터페이스(TCP/IP) : return 새로 생성된 소켓의 소켓번호;
connect() : 서버에 연결 요청
클라이언트 connect() 호출 > 3-Way Handshake 시작
문법
int connect (
int s, // 서버와 연결시킬 소켓 번호
const struct sockaddr *addr, // 상대방 서버의 소켓주소 구조체
int addrlen); // 구조체 *addr의 크기
- connect() 성공(0 리턴), 실패(-1 리턴, 전역변수 errno에 에러코드가 들어감)
- connect() 성공하려면 서버에서는 listen(), accept() 호출해 두고 있어야 함
- connect() 호출 중에 에러 발생시 : 다시 connect()호출 (X) , close() 후 새로 socket() (O)
send(), recv() : 데이터 송수신
- 스트림형(TCP) 소켓을 통하여 데이터를 송수신
- flags 옵션
- 일반 데이터 : 0
- flags : MSG_PEEK > 수신된 데이터 읽은 뒤, 데이터를 수신버퍼에 남겨둬서 다음번 read()에서도 같은 데이터를 다시 읽을 수 있도록 합니다.
- MSS(maximum segment size) : 한 IP 데이터그램에 실어서 전송할 수 있는 최대 데이터 크기
- MSS 보다 큰 데이터를 write(), send()하면 전체 데이터가 MSS 크기로 분할되어 전송됩니다.
- TCP에서는 segment의 순서 확인, 데이터그램 분실을 수신 측에서 검사&재전송 > 신뢰할만한 통신
UDP에서는 이러한 에러제어 제공 X
- TCP 소켓에서 write()나 send()를 실행하면
- 데이터는 TCP계층의 송신 버퍼에(send buffer)로 들어갑니다.
- 송신버퍼가 비어있지 않으면
- 프로세스는 블록 상태로 가고 프로그램은 write()문에서 기다리게 됩니다.
> write()문이 블록 된 경우에 송신 버퍼에 먼저 들어 있던 데이터가 전송되고
> write한 데이터가 송신버퍼로 모두 아동 하면 write() 문이 return 됩니다.- write() 문이 return 됐다 > 데이터가 자신의 TCP에 있는 송신 버퍼에 들어갔다 (목적지에 전달 X)
- 프로세스는 블록 상태로 가고 프로그램은 write()문에서 기다리게 됩니다.
close() : 소켓 닫기
- 소켓의 사용을 마치려면 해당 소켓번호를 지정하여 close()를 호출
- 클라이언트나 서버 중 누구나 먼저 호출 가능
- 송신버퍼
- 기본적으로는 송신버퍼에 있는 데이터들 모두 보내고 TCP연결 종료
- 소켓 옵션을 변경하여 미전송 된 데이터를 모두 버리고 종료할 수 있음
반응형