목록네트워크 프로그래밍 (3)
순간이 영원해 지는 곳
프로그래머 입장에서 보는 TCP와 UDP 패킷 전달 TCP는 신뢰성 있는 통신을 보장한다고 다들 배웠을 것이다. 프로그래머 입장에서 TCP를 다시 보자. 1. in-order delievery(순서대로 전송) 우리가 send(1000byte)를 여러번 호출하는 경우, send()호출 한번에 패킷 하나가 생성되어 전달된다고 가정해보자. 이 경우 네트워크 경로상의 문제로 인해 먼저 전송한 데이터가 나중에 전달될 수 있다. 하지만 프로그래머는 그것을 신경쓰지 않아도 된다. TCP(L4 : Transport Layer)에서 순서가 뒤 바뀐 패킷을 원래대로 조립하여 프로그래머가 다루는 데이터의 형태로 만들어서 상위계층( Application Layer )로 올려준다. 그러므로 송신자가 보낸 순서대로 수신자는 데이..
많은 사람들이 UDP 소켓 프로그램의 흐름은 아래 그림과 같다고 배웠을 것이고, 일부는 서버쪽에도 bind()함수가 없는 것으로 배웠을 것이다. 아닌가? ^^; 나는 UDP에 대해서는 이렇게만 알고 넘어간 뒤 TCP만 사용했었다. 나중에 UDP를 사용한 소켓 프로그램을 직접 만들때가 되어서야 UDP는 서버와 클라이언트의 개념이 모호하다는 걸 알았다. 일단 UDP 소켓 프로그래밍에서는 Listen(), Accept() 함수를 사용하지 않는다. Bind()는 UDP 서버에서 사용한다고 배웠을 것이고, 그럼 Connect() 함수는? Connect()함수를 사용하는 경우도 있다. 그러나 UDP에서 Connect()함수는 접속과는 관련이 없는 함수이다. Bind() : 프로세스에서 특정 포트를 명시적으로 쥐고 ..
MFC CAsyncSocket Class 비동기 소켓 클래스 이다. 비동기라 함은 함수가 실패했을 경우에도 곧장 리턴이 되어 다음 줄의 코드가 실행된다는 뜻이다. 따라서 이 클래스에 있는 Send, Receive, SendTo, ReceiveFrom 함수는 모두 호출이후 곧장 리턴되는 논블로킹(non-blocking) 비동기 함수 이다. 동기(blocking)함수라면 해당 함수가 성공하거나 대기시간이 만료될때까지 리턴되지 않는다. 아래는 CAsyncSocket클래스 또는 이 클래스를 상속받은 클래스의 객체에서 TCP를 사용하는 경우에 적용되는 콜백함수의 호출 시기다. * OnConnect() : 클라이언트에서 Connect()함수를 호출한 경우 Conncet 시도에 대한 결과가 나왔을때 호출된다. 이 함..