❓ 단말기 사이에 통신할 수 있게 OS에서 제공하는 자원
- 소켓 생성 시, 소켓 핸들 값이 반환, 대부분의 OS에서 int32 타입
- 데이터를 주고 받기 위해 소켓의 목적지 : 포트를 할당
데이터를 보내기 위해 연결 설정이 필요하지 않음 | 데이터의 신뢰성을 보장하지 않음 |
송신한 후에도 수신 여부를 확인하지 않음 ⇒ 신속한 데이터 전송이 요구되는 경우에 자주 사용 ex) 실시간 스트리밍, 온라인 게임 |
데이터가 손실될 수 있음 |
일 대 다 소켓 통신이 가능 | 패킷 유실 시 데이터그램이 유실 |
❓ 사용자가 정의한 데이터그램을 상대방에게 보낼 수 있게 하는 통신 규약 메시지 형식
사용법이 간단한 대신, 데이터 유실 또는 순서 뒤바뀜 같은 문제가 생길 가능성이 있음
소켓 통신
→ 수신용, 송신용 소켓을 따로 만들지 않아도 가능
// 송신
main()
{
s = socket(UDP); // 통신 규약 지정
s.bind(any_port); // 포트 지정 = any_port 옵션 : 운영체제가 알아서
s.sendTo("55.66.77.88:7777", "hello"); // 상대 주소와 포트, 전송할 내용 전송
s.close(); // 소켓 핸들 닫음
}
// 수신
main()
{
s = socket(UDP); // 통신 규약 지정
s.bind(7777); // 포트 지정 = any_port 옵션 : 운영체제가 알아서
r = s.recvfrom(); // r에 데이터 저장
print(r.srcAddrPort, r.data); // r에 저장된 데이터를 가공
s.close();
}
데이터를 전송하기 전에 먼저 연결을 설정 전송에 대한 오버헤드가 있기 때문에, UDP에 비해 속도가 상대적으로 느릴 수 있음
데이터를 전송하기 전에 먼저 연결을 설정 | 전송에 대한 오버헤드가 있기 때문에, UDP에 비해 속도가 상대적으로 느릴 수 있음 |
정확성과 순서를 보장하기 위해 확인 및 재전송 기능을 제공 ex) 웹 브라우징, 이메일 전송, 파일 다운로드, 인터넷 대부분 | 패킷 유실시 중간에 지연 시간이 발생 |
일 대 일 소켓 통신만 가능 | |
자체 “흐름 제어 기능”이 있어 패킷 유실 발생시에도 데이터를 정확히 전송 |
❓ 보내는 쪽 데이터가 받는 쪽에서 완전히 동일함을 보장해 주는 통신 규약
스트림 형식
UDP의 단점을 해결하기 위해 성능을 양보한 프로토콜
소켓 통신
// 송신
main()
{
s = socket(TCP); // 송신 전용 소켓 생성
s.bind(any_port); // 포트 지정 = any_port 옵션 : 운영체제가 알아서
s.connect("55.66.77.88::7777); // 수신 대상
s.send("hello");
s.close();
}
// 수신
main()
{
s = socket(TCP); // 리슨 전용 소켓 생성
s.listen(7777); // TCP 연결을 받는 고정된 끝점 확보
s2 = s.accept(); // 연결 받을떄 까지 블로킹
print(getpeeraddr(s2)); // 수신쪽 끝점 정보 출력
while(true)
{
r = s2.recv(); // 데이터 수신
if(r.length == 0) // 스트림 형식이기 때문에 0바이트 시 종료를 의미
break;
print(r);
}
}
1 - 2) 스레드 (thread)? (0) | 2023.10.12 |
---|---|
1 - 1) 멀티스레딩 개요 (1) | 2023.10.11 |