6.2 udp 기반 서버/클라이언트의 구현

1] udp 서버는 클라이언트와 연결되어 있지 않다.
udp클라이언트와 서버는 연결(connection)상태가 존재하지 않으므로 tcp처럼 송수신시 서로 연결하는 과정을 필요로하지 않는다.
즉, tcp 기반 서버에서 호출하던 listen(), accept() 함수와
tcp 기반 클라이언트에서 호출하던 connect() 함수의 호출은 불필요하다.
오로지 소켓의 생성과 주소 할당만이 udp 의 역할이다.
2] udp 서버의 소켓을 오직 하나.
tcp 에서는 소켓의 관계가 일대일 이었다. 즉 서버에 열명의 클라이언트가 연결되었으면 소켓은 열 개 였을거라는 이야기.
하지만 udp 에서는 하나의 소켓만 있으면 된다.(하지만 상황에 따라 효율성을 근거로 여러 소켓을 생성하는 경우가 있다.)
udp 기반의 소켓 통신 모델

udp 를 편지, tcp 를 전화에 비유한다. (하지만 상대적으로 편지가 늦고 전화가 빠르다 라는 이러한 속도의 개념은 제외함.)
3] udp 기반의 데이터 입/출력 함수
tcp 소켓 생성 후 데이터 전송시에는 주소에 대한 정보를 따로 전달하지 않는다. 왜냐하면 tcp 소켓은 호스트와 연결된 상태에서 데이터를 주고받기 때문이다. 즉 소켓은 데이터를 전송해야 하는 호스트의 주소 정보를 알고있다.
그러나
udp 소켓은 연결 상태를 유지하지않는다. (그저 소켓은 우체통의 역할) 그러므로 데이터를 전송하는 함수 호출 시 반드시 보내고자 하는곳의 주소정보를 포함해야 한다.
**전송하는 함수.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<sys/types.h>
#include<sys/socket.h>
int sendto(int sock, const void* msg, int len, unsigned flags, const struct sockaddr* addr, int addrlen)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sock : 데이터 전송시 사용할 소켓의 파일 디스크립터를 인자로 넘겨준다. 우체통을 설정한다고 생각하자.
msg : 전송하고자 하는 데이터를 저장해 놓은 버퍼를 가리키는 포인터.
len : msg 포인터가 가리키는 위치에서부터 몇바이트를 전송할 것인지 그 크기를 인자로 넘겨줌.
flags : 옵션설정시 필요한 인자. 보통 0 을 넣어준다. 크게 사용되지 않음.
addr : sockaddr 구조체. 전송하고자 하는곳의 주소 정보로 초기화한 다음에 인자로 넘겨줌.
addrlen : addr 포인터가 가리키고있는 구조체 변수의 크기를 인자로 넘겨줌.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**수신하는 함수.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<sys/types.h>
#include<sys/socket.h>
int recvfrom(int sock, void* buf, int len, unsigned flags, struct sockaddr* addr, int* addrlen)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sock : 데이터 수신시 사용할 소켓의 파일 디스크립터를 인자로 전달. buf : 수신할 데이터를 저장할 버퍼를 가리키는 포인터.
len : 수신할 수 있는 최대 바이트 수. 일반적으로 buf 가 가리키는 저장소의 크기를 넘지않는다.
flags : 옵션을 설정하는데 필요한 인자.
addr : 주소 정보 구조체 변수의 포인터를 인자로 넘김. 함수호출이 끝나면 데이터를 전송한 호스트의 주소정보로 채워짐.
addrlen : addr 포인터가 가리키는 주소 정보 구조체 변수의 크기를 인자로 전달함.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




최근 덧글