본문 바로가기
[ ★ ]Study/Network

connect 함수

by nroses-taek 2017. 2. 26.

Windows Version

#include <winsock2.h>

Linux Version

#include <sys/types.h>

#include <sys/socket.h>

Function Prototype

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

 

connect 함수는 연결 대기 중인 서버로 실제 연결을 맺는 함수이다.

소켓을 생성할 때 소켓 형태가 SOCK_STREAM으로 생성된 경우

Client에서 Server로 접속하기 위해서 사용하는 함수로, connect() 함수를 호출하여

성공적으로 연결이 맺어지면 TCP Protocol에서도 3 Way-Handshake가 맺어지게 된다.

 

connect 함수를 호출하기 위해서는 인자가 3개 들어간다.

1. socket함수를 호출 후 socket descriptor 지정.

2. 접속하고자 하는 IP 및 Server Port 정보가 있는 sockaddr 구조체의 주소값을 지정.

3. 전달하고자 하는 구조체의 주소값. 즉, sockaddr구조체의 길이를 지정하면 된다.

 

 

sockaddr구조체는 다음과 같이 정의되어 있다.

struct sockaddr{
    sa_family_sa family;
    char sa_data[14];
}

 

왜 sa_data가 14bytes를 할당되는지 찾아보는 것도 좋을 것이다.

 

sockaddr 구조체는 소켓관련 함수를 사용하기 위해서 최종적으로 변환되는 구조체로 TCP/IP의

 

실제 주소를 저장하기 위해서는 sockaddr 구조체와 같은 크기를 갖는 sockaddr_in의 구조체가 사용된다.

 

sockaddr_in 구조체는 다음과 같은 내용으로 정의 된다.

struct sockaddr_in{
    sin_family_t sin_family;
    uint16_t sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
};

 

멤버 변수 sin_port는 UDP 및 TCP Protocol에서 사용되는 포트 주소값을 저장한다. 그리고 멤버 변수

sin_addr은 IP주소값을 저장하기 위한 멤버 변수로 주소를 저장할 수 있는 구조체 in_addr을 사용한다.

 

in_addr구조체는 다음과 같이 하나의 멤버인 4바이트 크기의 변수 s_addr을 갖는 구조체로 다음과 같이 정의되어 있다.

typedef uint32_t in_addr_t;
struct in_addr{
    in_addr_t s_addr;
};

 

멤버 sin_zero는 sockaddr 구조체와 같은 크기를 유지하기 위해서 필요한 padding 공간으로 항상 0이 저장된다.

(padding 이라는 용어를 모른다면 익숙해지자)

 

connect함수를 호출한 뒤에서는 서버와의 연결이 성공적으로 이뤄지게 되면 0을 리턴하고 연결에 실패하면 0보다 작은 값을 리턴한다.

network !

'[ ★ ]Study > Network' 카테고리의 다른 글

bind 함수  (0) 2017.03.05
socket 함수 (linux, window)  (0) 2017.03.05
CGI 란  (0) 2017.02.26
Available threads in Windows and Linux.  (0) 2017.02.26
Packet Capture Library  (0) 2017.02.26

댓글