반응형

소켓의 생성(2)

 

 

socket 함수의 두 번째 인자로 "SOCK_STREAM"을 전달하면, 연결 지향형(TCP) 소켓이 생성된다.

 

ssocket(PF_INET, SOCK_STREAM,?);

 

PF_INET : IPv4 프로토콜 체계를 사용한다.

 

SOCK_STREAM : TCP 전송방식을 사용한다.

 

? : 기본 설정으로 0을 전달해야 하지만, 나중에 설명하기 위해 '?'로 채웠다.

 

그렇다면 연결지향형(TCP) 소켓은 어떤 특성을 가지고 있을까?

 

연결 지향형(TCP) 소켓의 특성은 아래의 사진과 같다.

 

-

 

 

-

 

위에 사진의 특징 중에서 "데이터의 경계를 구분 안 함"이라는 말은 다음 상황과 같다.

 

-

 

"사탕 가게에서 A라는 손님이 사탕 100개를 달라고 했다.

 

그래서 사탕가게 직원은 A에게 사탕 100개를 2개씩 50번에 걸쳐서 줬다.

 

그런데 A는 사탕 100개가 다 쌓일 때까지 모아두고, 다 모이자 한 번에 봉지에 담아서 가져갔다."

 

-

 

위의 상황을 이전에 포스팅에서 봤었던 write 함수와 read 함수를 이용해서 설명하면

 

-

 

" 데이터를 전송하는 컴퓨터 A와 데이터를 받는 컴퓨터 B가 있다고 가정할 때

 

A가 세 번의 write 함수 호출을 통해서 총 100바이트를 전송했다.

 

그런데 B는 한번의 read 함수 호출을 통해서 100바이트 전부를 받았다"

 

-

 

데이터를 송수신하는 소켓은 내부적으로 버퍼(buffer)를 가지고 있다.

 

즉, 바이트 단위의 배열을 가지고 있는것이다.

 

그리고 소켓을 통해 전송되는 데이터는 일단 이 버퍼(buffer), 즉 배열에 저장된다.

 

그렇기에 데이터가 수신되었다고 해서 바로 read 함수를 호출해야 하는 것은 아니다.

 

이 배열의 용량을 초과하지 않는 한, 

 

데이터가 채워진 후에 한 번의 read 함수 호출을 통해서 

 

배열에 저장되어 있는 데이터를 전부 읽어 들일 수도 있고,

 

반대로 한 번의 write 함수 호출로 전송된 데이터 전부를 여러 번의 read 함수 호출로 

 

나눠서 데이터를 읽어 들일 수도 있다.

 

-

 

즉,  연결 지향형(TCP) 소켓의 경우에 

 

write 함수의 호출 횟수와 read 함수의 호출 횟수는 큰 의미를 갖지 못한다.

 

그렇기에 연결지향형(TCP) 소켓은 데이터의 경계가 존재하지 않는다고 말하는 것이다.

 

즉, "데이터의 경계가 존재하지 않는다"라는 말은 

 

송신과 수신을 하는 함수의 호출 횟수가 서로 같지 않아도 된다는 것이다.

반응형

+ Recent posts