본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]윤병도_10월19일(TCP 서버 클라이언트 프로그래밍)

by 알 수 없는 사용자 2011. 10. 19.
728x90
반응형

*sockaddr_in 구조체
struct
 sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;      /* Port number.  */
    struct in_addr sin_addr;    /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
         __SOCKADDR_COMMON_SIZE -
         sizeof (in_port_t) -
         sizeof (struct in_addr)];
  };

*포트번호
2바이트이므로 65535까지 사용가능하지만 1024까지는 시스템이 사용하고 그 이후의 포트번호가 할당된다
예를 들면 80번은 web서비스를 위해 사용된다 
*IP주소 설정
서버에서 serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")로 설정을 해주거나
다음과 같이 설정할 수도 있다
inet_pton(AF_INET,"127.0.0.1",&stAddr.sin_addr.s_addr );
*bind()
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
bind()함수는 소켓을 우리가 설정한 구조체내용(iP주소,PORT번호)로 setting하는 것이다
bind함수의 두번째 인자는 (struct sockaddr*)로 캐스팅한다 (우리가 인터넷 기반으로 사용하는 sockaddr_in
구조체를 bind함수는 인자로 받지 않는다)
sockaddr과 sockaddr_in구조체를 비교해 보면 크기가 동일하고 멤버들의 갯수와 이름이 다름을 볼 수 있다
반환값-- 성공시 0을 실패시 -1을 반환
이제 서버에서 sockaddr_in구조체의 내용을 소켓에 bind하였으므로 우리는 그 IP주소와 port번호로 통신이 가능하다
클라이언트에서는 bind()대신 connect()함수를 사용해서 위와 같이 소켓 디스크립터와 sockaddr_in구조체를 연결시키는 것을 볼 수 있다
위의 소켓 setting까지는 서버와 클라이언트모두 대동소이하다

*listen()
int listen(int s,int backlog);
listen함수는 소켓에서 연결을 기다리는 역할을 한다 연결요청이 들어오면 accept()를 호출하여 다른소켓(communication socket)을 생성한다
listen함수의 두번째 인자는 연결을 기다리는 클라이언트를 저장하는 대기큐의 최대수이다
반환값-- 성공시 0을 실패시 -1을 반환
*accept()
int accept(int s, struct sockaddr *addr ,socklen_t * addrlen);
accept()함수는 클라이언트가 들어올때 까지 블로킹되어 있다
랑데뷰소켓(bind소켓)은 클라이언트에서 보내져서 큐상에서 대기하고 있는 정보(서버와 통신을 원하는 클라이언트의 정보)를 두번째 인자에 연결한 다음 클라이언트소켓과 연결된 새로운 소켓을 반환한다
앞으로 그 클라이언트와의 통신은 반환된 소켓 디스크립터를 사용한다
반환값-- 성공시 communication 소켓 디스크립터, 실패시 -1을 반환
이 communicatoin 소켓을 이용하여 통신을 한다

*예제코드




728x90