Client connect() Network/tcp 2011. 4. 26. 16:43

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

sockfd : 미리 생성해 놓은 소켓의 파일 디스크립터이다.
serv_addr : 서버 주소 정보 지닌 구조체
addlen : serv_addr 포인터가 가리키는 주소 정보 구조체 변수 크기

주요 사항!!!!
해당 함수의 리턴 시점은 서버에 의해 요청 수락, 오류 발생으로 연결 요청 중단
만약!!! 연결 요청이 바로 이루어 지지 않고 서버의 대기 큐에서 대기시,
connection 함수는 블로킹 상태에 있게 된다.

********
클라이언트의 소켓 주소 정보에 대해...

connection함수를 호출하면,
운영체제(커널)에서 자동으로 호스트에 할당되어 있는 IP와 남는 PORT중 하나를 할당해 준다.

하나의 Server Machine에 여러개의 네트워크 인터페이스가 존재할 수 있다.

이때 서버 IP의 선언을 serv_addr.sin_addr.s_addr=htonl(INADDR_ANY)과 같이 하면
Listen 함수 호출 시 해당 포트에 대한 여러 IP 인터페이스 요청도 받아 들일 수 있게 된다.

실제 600번 포트를 사용하고 있을 때,
netstat -na 명령을 입력하면 0.0.0.0:600 0.0.0.0:0 으로 나타난다.

이후 클라이언트가 접속을 시도시 다시 명령 입력하면 다음과 같은 상태를 확인할 수 있다.

0.0.0.0:600 0.0.0.0:0                       LISTENING

            192.168.10.103:600 192.168.10.3         ESTABLISHING

정리
서버 : 여러 NIC을 통해서 들어오는 요청을 PORT와 매칭하여 수신에 응한다.
클라이언트 : 여러 NIC중 아무 것이나 사용하여 전송에 사용한다. (해당 옵션 사용시 배정받은 IP주소 확인 절차 필요)

이상이다.



Accept의 Return은 커널에 의해 자동 생성된 소켓이다.
서버는 쓰레드와 Accept의 자동 생성되는 소켓들을 사용하여 각각의 통신을 병행 처리를 원할하게 할 수 있다.

'Network > tcp' 카테고리의 다른 글

Client connect()  (0) 2011.04.26
INADDR_ANY >>>serv_addr.sin_addr.s_addr=htonl(INADDR_ANY)<<<  (0) 2011.04.26