클라이언트는 아래의 시스템 콜을 통해 서버에 연결 요청을 송신한다.

#include <sys/socket.h>
 
int connect(int sock, struct sockaddr *servaddr, socklen_t addrlen);
  • sock : 클라이언트 소켓의 파일 디스크립터 전달
  • servaddr : 연결요청 할 서버의 주소 정보를 담은 변수의 주소 값 전달
  • addrlen : 두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달
  • 반환값 : 성공 시 0, 실패 시 -1 반환

클라이언트에 의해서 connect 함수가 호출되면 다음 둘 중 한가지 상황이 되어야 함수가 반환된다(함수 호출이 완료된다).

  1. 서버에 의해 연결 요청이 접수됨.
  2. 네트워크 단절 등 오류 상황이 발생해서 연결 요청이 중단되었다.

여기서 주의할 사실은 위에서 말하는 연결 요청의 접수는 서버의 accept 호출을 의미하는 것이 아니라는 점이다. 이는 클라이언트의 연결 요청 정보가 서버의 연결 요청 대기 큐에 등록된 상황을 의미하는 것이다. 때문에 connect 함수가 반환했더라도 당장에 서비스가 이뤄지지 않을 수도 있음을 기억해야 한다.

클라이언트 소켓의 주소 정보를 따로 등록하지 않는 이유

클라이언트 소켓이 서버 소켓과 다른 점은 bind를 통해 주소 정보를 등록하지 않는다는 점이다.
하지만 네트워크를 통해 데이터를 송수신하려면 클라이언트 소켓에도 주소 정보가 등록이 되어야 한다.
클라이언트 소켓의 주소 정보 등록은 connect가 호출될 때 커널에 의해 자동으로 이루어진다.
IP는 컴퓨터(호스트)에 할당된 IP로, PORT는 비어있는 포트 중 하나를 임의로 선택해 할당한다.


참고자료

윤성우의_열혈_TCP_IP_소켓_프로그래밍