소켓플밍에서 운영체제가 해주는 부분에는 어떤 부분이 있을까요? 예를들어 제가 헷갈렸던 부분중 한가지가 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 에 다 나와있습니다..