TCP/IP socket programming의 이해



일단 기본적인 socket api를 이해한 사람을 대상으로 쓰는 글이다.

이것을 모른다면 http://wiki.kldp.org/wiki.php/BeeJNetworkProgramming 를 참고하기 바란다.

아직도 api 헷갈리면 가끔씩 찾아보는 사이트다. ^^; 여기의 소스는 오류가 있는 코드도 있다.

심지어 실행안되는 코드도 있을 것이다. (환경차이가 아닌 코드의 문제로 인해서..환경에 관한

문제는 대부분 설명되어있다. 대충보면 찾기 힘들수 있다. ^^)

그것도 알아서 찾으면 공부 된다. ^^;;;

일단 서버

socket() :
소켓 디스크립터를 얻는 api다. 파일디스크립터와 비슷하다고 보면된다.


setsockopt() :
포트가 열린상태로 서버가 죽을수 있다. 이것을 무시하는 역활을 한다.


bind() :
포트를 연다. 만약 위의 함수가 실행되지 않았으면 에러가 난다.


listen() :
열린포트로 접속을 받아 들이며 큐의 형식으로 저장이 된다.
먼저 온사람을 먼저 처리함.


             이 상태부터 연결을 받을수 있으나 아직 연결된것은 아니다.


accept() :
이 함수를 호출 했을때 위에서 생성된 큐에서 가장 오래된 접속자를 꺼낸다.


(이렇게 해야 순서대로 되지 않겠는가?) 이때 새로운 소켓디스크립터가 생성된다.
(socket()에서는 서버의 디스크립터이고 여기서는 클라이언트의 디스크립터다
두가지가 있는 것은 어떤 클라이언트로 부터 데이터를 주고 받을지 모르기 때문이다)



클라이언트

socket() :
새로운 소켓 디스크립터를 만든다.
클라이언트는 오로지 자신의 디스크립터만 갖는다.

connect() :
ip와 port의 정보만 있으면 접속할 수 있다. 최소한 서버는 listen()까지 실행해야한다.

                상대방이 accept()를 실행해야만 send(), recv()가 가능해진다.


오늘의 하이라이트 send(), recv()

사람들은 send()와 recv()의 개념을 혼동한다. 일단 준다와 받는다까지는 이해를 한다.

그런데 그 타이밍에 대해서 많이 헷갈려한다.

send() :
일단 connect()나 accept()되면 해당 소켓을 이용해서 데이터를 줄수 있는데 일단 send()를 하면상대방이 recv()를 호출하건 말건 데이터를 보내게 된다. 주의할점은 TCP/IP의 구조상1500byte 이상은 불안할수 있다. 보통은 1KByte (1024Byte) 미만으로 자른다.

recv() :
만약 큐를 봐서 받은 데이터가 없으면 넘어간다. 만약 데이터가 있다면 작동하여
소켓으로 온 데이터를 받을수 있다. 멀티플렉싱을 이용해서 recv()전에 블럭시킬수도 있다.
만약 누군가 데이터를 보냈을대만 recv()를 실행하게 하는것이다.단독으로 recv()를 실행할 경우 받은 데이터가 없다면 그냥 다음으로 넘어간다.이때 받은 바이트는 0으로 된다. 뭔가 소켓에서 변화가 있었는데 0byte받았다면이건 끊긴것이다.

정리하자면....

send()는 무조건 데이터를 보내는 함수이고

recv()는 데이터가 없으면 말고 있으면 가져오는 함수이다.

send()와 recv()를 동시해 실행야 받을수 있다는 편견은 버리자. ^^;

원본 : http://blog.naver.com/bmsdong/40017013061

2006/05/07 01:58 2006/05/07 01:58
Trackback address :: http://4ellene.net/tt/trackback/852

Comments List

  1. young amateur videos 2008/05/23 06:59

Write a comment.

[로그인][오픈아이디란?]