C++

c - socket 프로그래밍

hellowhales 2023. 4. 4. 18:24
728x90

 Socket programing - TCP

소켓 프로그래밍은 네트워크를 통해서 통신을 하는 프로그램을 만드는 것을 말합니다. 소켓 프로그래밍은 크게 연결 상태를 유지하는 TCP 방식와 연결상태를 중요치 않게 생각하는 UDP 방식으로 나눌 수 있습니다. 이 포스터에서는 문제를 위해 TCP 방식에 대해서만 간단히 알아보겠습니다. 

우선 네트워크를 통해서 두 컴퓨터 혹은 프로세스가 통신할라면 한쪽은 Server가 되고 다른 쪽은 Client가 되어야합니다.

서버 쪽 함수들을 먼저 보겠습니다.

  •  socket() : 소켓을 생성해주는 함수로 사용하는 프로토콜을 지정해주고 TCP/UDP인지 지정해줍니다. 소켓 descriptor를 리턴합니다.
int socket(int family, int type, int protocol);
  • bind() : 소켓의 IP주소 및 포트 번호를 지정해줍니다.
int bind(int sd, struct sockaddr *myaddr, int addrlen);

struct sockaddr_in { // 두번째 인자에 들어가는 값으로 sockaddr로 캐스팅해서 넣습니다.
	short sin_family; /* PF_INET */
	u_short sin_port; /* 16-bit port number */
	struct in_addr sin_addr; /* Network byte ordered address */
	char sin_zero[8]; /* Unused */
};
  • listen() : 동시에 몇개의 접속까지 허용할 것인지 정합니다. 하지만 최근에는 별로 의미가 있진 않고 관습적으로  사용합니다.
int listen(int sd, int backlog);
  • accept() : 커넥션이 오기를 기다립니다. 커넥션이 오면 맺어진 새로운 소켓 디스크립터 리턴합니다.  *peer에 클라이언트에 대한 정보가 저장됩니다.
int accept(int sd, struct sockaddr *peer, int *addrlen);
  • read(),write() : 소켓이 맺어진 후 맺어진 소켓 디스크립터를 통해서 데이터를 적거나 읽어 옵니다.

서버의 함수들과 용도가 똑같고 추가로  connet가 있습니다.

  • connet() : 2번째 인자로 서버쪽 주소와 포트를 주면 socket을 연결해줍니다.
int connect(int sd, struct sockaddr *servaddr, int addrlen)

위와 같은 방식으로 두 프로세스가 연결되면 파일에 글을 쓰는것과 마찬가지로 read,write를 통해서 통신할 수 있습니다.

728x90