프로그램이 데이터를 보내거나 받는 과정 => UDP 또는 TCP 소켓 통신
source: http://jkkang.net/unix/netprg/chap2/net2_1.html
main() {
// (1) UDP 사용 선언, 소켓 핸들 반환
s = socket(UDP);
// (2) 데이터를 주고 받기 위해 포트를 하나 할당받음.
// any_port(0)을 넣으면 OS가 알아서 사용 중인 포트를 할당해줌
s.bind(any_port);
// (3) 상대방의 주소와 포트, 즉 끝점(endpoint)에 원하는 데이터를 보내면 됨
s.sendTo("55.66.77.88:5959", "hello");
// (4) 소캣 핸들 닫기
// 소캣 핸들이 닫히면 할당받은 포트도 다른 곳에서 사용 가능한 상태가 됨
s.close();
main() {
s = socket(UDP);
// (1) bind() 시 포트 번호를 명시적으로 지정
// 송신측에서 포트 5959번으로 데이터를 보냈기 때문
s.bind(5959);
// (2) recvfrom()을 호출하여 데이터를 받음
// 데이터가 아직 도착하지 않았으면 함수는 리턴하지 않음 => "블로킹 상태"
r = s.recvfrom();
print(r.srcAddrPort, r.data);
// (출력) => 11.22.33.44:53234 hello
s.close();
}
main() {
s = socket(TCP);
s.bind(any_port);
// (1) connect() 함수는 연결에 성공할 때까지 블로킹됨.
s.connect("55.66.77.88:5959");
// (2) 이미 연결이 되었기에 sendTo가 아닌 send 호출
s.send("hello");
s.close();
}
main(){
s = socket(TCP);
// (1) s는 listen 소켓 역할
// listen 소켓은 TCP 연결을 받아들이는 역할
s.listen(5959);
// (2) accept()를 실행하면 상대방에게 TCP 연결을 받을 때까지 블로킹됨
// TCP 연결이 받아지면 새로운 소켓이 생성되며, 소켓의 핸들 값이 리턴됨
// 상대방과의 통신은 이 새로운 소켓으로 함
// 새로운 소켓은 listen 소켓이 점유한 포트 값과는 다른 포트 값을 가짐
s2 = s.accept();
// (3) 상대방 끝점 확인
print(getpeeraddr(s2));
while(true) { // 네트워크에서의 스트림 특성상 send() 호출 횟수와 recv() 호출 횟수가 일치하지 않을 수 있음
r = s2.recv();
// (4) UDP 메시지는 0바이트 메시지도 허락
// TCP에선 0바이트를 수신하면 '연결 종료'를 의미 (like eof)
if(r.length == 0)
break;
print(r);
}
s2.close();
}