반응형
그렇다면 서버는 어떻게 클라이언트에게 메세지를 보낼까????
포트 없이 보낼수 있는것일까????

=========

제가 보는 tcp/ip책에서 나오는 문제인데요...
udp서버에서는 port 번호를 bind()를 통하여 명시하지만 udp클라이언트에서는 bind()를 명시하지 않는다.
어떻게 udp클라이언트 소켓에 포트 번호를 부여할수 있는가?

======
제가 책을 잘못이해하는 건지 읽을수록 헷갈립니다.
tcp/ip 소켓프로그래밍c버전 사이텍 미디어에서 나온건데요.
얇아서 샀더니 내용이해하기가 어렵내요.
두꺼운책 살것을 그랬나?
^^
좋은책 추천도 같이 부탁드립니다.
추가된 질문 (2004-03-26 17:33 추가)

소켓플밍에서 운영체제가 해주는 부분에는 어떤 부분이 있을까요?
예를들어
제가 헷갈렸던 부분중 한가지가 listen()인데요.
listen 함수는 생성한 socket을 bind 된 포트에 연결시켜 주는 역할을 합니다.
그리고 접속들어온 소켓이 들어갈 큐를 생성하고 끝냅니다.
운영체제에서 소켓접속이 들어오면 큐에 집어넣죠.
바로 여깁니다.
운영체제가 접속이 들어오는것을 큐에 집어넣는것이지
listen()해주는 것이 아니었습니다.^^;;;;
다른부분에도 이런부분이 있을텐데요.
아시는분 답변좀 부탁드려요...


------------------------------------------------------------------------------------------------------

connect()콜이 리턴되면서 소켓에 포트가 바인딩 됩니다. 물론, 실제로는 connect()콜을 부를때, 시스템에서 임의의 포트를 할당해 주긴 하지만, connect()콜이 실패하면 포트바인딩이 해제되므로, 그 시점에서 실제로 포트가 할당된 것은 아니고, connect()가 리턴되면 임의의 포트에 실제로 바인딩 됩니다. 물론, connect()호출하면서 서버측에 임의로 할당된 포트번호를 보내서 서버측에서 생성되는 소켓과 바인딩되지요.

listen()콜 역시 마찬가지입니다. listen()콜은 지정된 포트가 할당된 소켓에 대해서 동작하지만, listen()콜이 리턴되면 임의의 포트번호를 가진 소켓이 새로 생성되어 리턴됩니다.

즉, 클라이언트 사이드에서는 connect()콜에 의해 소켓은 임의의 포트와 바인딩되며,
서버사이드에서는 listen()콜에 의해, 임의의 포트에 바인딩된 소켓이 생성된다는 것이죠.

------------------------------------------------------------------------------------------------------

bind의 의미는 이 포트로 들어오는 팻킷은 나(소켓)에게 달라는 의미입니다.
그러므로 받을 때가 아니면 쓸 필요가 없습니다.
UDP 클라이언트의 경우 팻킷을 보내는 일만 한다면 bind가 필요없죠.
물론 팻킷을 보낼 때도 포트는 필요합니다. 이때는 시스템이 아무값이나 넣어줍니다.

소켓프로그래밍에서 운영체제가 하는 중요한 일은 이벤트 발생입니다.
실제로 accept나 recv와 같은 함수들은
팻킷이 들어왔는지 안 들어왔는지 알 수 없습니다.
그냥 멍하니 멈춰서 기다리고만 있습니다.
이 때 운영체제가 팻킷을 받아서 accept나 recv같은 함수에게 알려주는 거지요.
'팻킷이 새로 들어왔으니까 와서 가져가라' 이런 식으로요..

흠.. 정확한 관계를 알려면 커널에 대한 이해가 좀 필요합니다.
그리고 리눅스를 사용하신다면 소켓프로그램의 기본은
http://wiki.kldp.org/wiki.php/BeeJNetworkProgramming
에 다 나와있습니다..

그럼..

반응형
Posted by Real_G