한국어 English Chinese Russian

자주 묻는 질문들 / 기술지원


No.90 소켓 프로그램을 했는데 데이터가 잘려서 들어옵니다. 08-09-2004
카테고리 : 유틸리티/utility
카테고리 : 안 돼요!!/can not

TCP통신과 UDP통신의 차이점


TCP통신은 stream방식으로 통신을 하고, UDP통신은 block단위로 통신을 합니다.
예를 들어 10bytes, 20bytes, 50bytes 이렇게 세번에 걸쳐서 데이터를 Ethernet을 통하여 보냈으면 TCP의 경우 10bytes, 20bytes, 50bytes 의 크기로 데이터가 수신 되지 않습니다. Ethernet망의 상태와 패킷량에 따라서 수신측에서의 데이터 크기는 변할 수 있습니다. UDP의 경우에는 block단위로 통신을 하기 때문에 10bytes, 20bytes, 50bytes씩 수신이 가능 합니다. 그러나 UDP는 전송제어를 하지 않기 때문에 Ethernet망의 상태에 따라서 데이터의 손실이 생길 수 있습니다.


데이터 처리시 유의 사항


수신된 데이터를 처리 할 때 원하는 데이터의 bytes 수 만큼 계속 읽은 후 처리를 해야 합니다. 예를 들어 48bytes의 길이를 가지는 frame 형식의 데이터를 받는 다고 생각하면 한번에 48bytes를 읽을 수도 있고 못 읽을 수도 있기 때문에 실제 수신된 데이터가 48bytes가 될 때까지 수신을 한 후 처리를 해야 합니다.


데이터 처리시 예제


* CAsyncSock을 사용하는 윈도우용 소켓프로그램 예입니다.
* 기능 : ezTCP와 연결되어 4바이트씩의 데이터를 읽어옵니다.


int rcvd_len = 0;
BYTE rcvd_buf[32];
CAsyncSock *sock;

...
...
...

void test::DoIt(void) < == 4바이트 데이터를 처리하는 함수
{
...
...
}

...
...
...

void test::OnReceive(int nErrorCode)
{
int len;
BYTE buf[32];

// Receive 함수는 읽은 데이터의 length를 반환 합니다.
len = sock->Receive(buf, 4 - rcvd_len, 0);
memcpy(rcvd_buf + rcvd_len, buf, len);
rcvd_len += len;

// 4bytes를 다 읽었으면 필요한 처리를 한다.
if(rcvd_len == 4)
{
DoIt();
rcvd_len = 0;
}
}




See also

  FAQ No.95 Windows/Linux socket 프로그래밍시 유의사항

Related Products