아래 소스는 서버부분이다. 이번에는 udp방식으로 서버를 구현하였다.
소켓을 생성하고 memset()함수 호출, 그리고 구조체 설정 bind()함수 호출부분은 저번시간에 구성한 tcp서버와 동일하다.
그러나 listen()함수와 accept()함수가 보이지 않는다. 그이유는 udp는 tcp와는 달리 구체적으로 세밀하게 데이터를 연결 송수신을 하지 않는다. 그래서 필요없다. 장점은 속도는 빠르다. 그러나 단점으로 정확성이 떨어진다. 데이터를 보내고 상대측에서 받아도 그만, 안 받아도 그만인 형식. 그냥 데이터를 보내면 역할이 끝난다. 이부분이 tcp와 다른 점이자, 단점이라고 할 수 있다.
위의 sigaction부분은 당연히 ctrl+c를 눌렀을 때 정상종료 하도록 구현한 것이다. 어제 배운것이므로 설명을 생략.
핵심부분은 while문안에 있는 recvfrom()함수가 되겠다.
1.첫번째 인자는 소켓
2. 두번째 인자는 버퍼. 데이터를 저장하는 메모리
3. 인자는 버퍼의 크기가 되겠다.
4.flag
5. 구조체 설정의 주소. 클라이언트로 부터 데이터를 받으면, 데이터를 저장하는 주소. (상대방 주소)
6. 4번째 인자의 데이터 저장의 크기, 그러나 그냥 sizeof()연산자로 크기를 지정못함. 그 이유는 함수 원형이 &이다.
그래서 while()문 위에 cliAddrLen=sizeof(echoClntAddr);이 존재한다. cliAddrLen을 5번째 인자로 지정하였다.
그리고 아래 smart()함수는 핸들러 함수가 되겠다. 여기서는 네트워크상의 패키지를 보는 pcap이 아닌, 서버이기 때문에 그냥 close(sock);을 한다.
클라이언트 부분.
위의 설정 부분은 동일하다.
여기서의 핵심은 sendto()함수이다. 일단, read()함수로 키보드로 보내고자 하는 데이터를 입력받는다.
sendto()함수
첫 번째는 소켓. 두번째, 버퍼, 세번째 인자는 read()함수에서
네번째와 , 다섯번째 인자는 위에 recvfrom()함수와 동일하다.
아래는 실행결과
'네트워크 > vmware 실습' 카테고리의 다른 글
7월 5일 thread()개념 (2) | 2013.07.05 |
---|---|
7월 4일 멀티태스킹과 프로세스 fork()함수 (0) | 2013.07.04 |
7월 2일 signal 신호 (0) | 2013.07.02 |
7월 1일 zterm 3handshake개념 (1) | 2013.07.01 |
6월 28일 L3부분2. (0) | 2013.06.28 |