[Computer Network] Network Programming(hello world)

G·2023년 3월 12일
0

Socket Programming

목록 보기
1/6

네트워크 프로그래밍이란 소켓 기반의 프로그래밍이다. 소켓이란 운영체제에서 제공하는 소프트웨어적 장치이다. 컴퓨터는 네트워크를 통해 데이터를 전송하는 것을 파일로 처리한다.

소켓켓은 종종 전화기와 비교한다.

소켓의 생성

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

소켓 생성은 전화기 장만에 비유할 수 있ㄷ.

전화를 거는(client) 용도의 소켓과 전화를 받는(server) 소켓은 차이가 있다.

전화를 걸기 위해 전화번호가 필요하다. 소켓도 이와 마찬가지로 주소를 부여해야한다.
이는 IP주소와 Port번호가 필요하다.

주소의 할당

int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

첫 번째 매개변수: 소켓 번호
두 번째 매개변수: IP주소와 Port번호
성공 시 0, 실패 시 -1 반환

일반 소켓은 전화 발신만 가능하다. 전화 수신을 하기 위해서 서버 소켓을 생성해야한다.

서버 소켓

int listen(int sockfd, int backlog);

위의 함수는 일반 소켓을 수신할 수 있는 소켓으로 바꾸어준다.

상대방이 전화를 발신하면 이를 수신해줘야한다.

데이터 수신

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

상대방이 전화를 발신할 때 이를 받아 의사소통할 수 있게 된다.
발신할 때, 즉 일반소켓이 연결요청을 할 때 이 함수를 통해 수신할 수 있게 된다.
함수 호출 이후에 데이터의 송수신이 가능해진다.
성공 시 소켓이 리턴된다. 실패 시 -1이 반환된다.

서버단에서 연결 요청을 허용하는 생성과정은 다음과 같다.

socket(소켓의 생성) -> bind(IP와 PORT번호 부여) -> listen(연결요청 가능상태로 변경) -> accept(연결요청에 대한 수락)
(서버는 연결을 요청하는 클라이언트보다 먼저 실행되어야 한다.)

클라이언트

socket() -> bind() 과정은 동일하다.(소켓의 생성)
전화를 발신하는 상황에 비유할 수 있다.

전화 발신(연결 요청)

연결의 요청(전화의 발신)

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

첫 번째 매개변수: 생성된 소켓
두 번째 매개변수: 서버 소켓의 주소
성공 시 0, 실패 시 -1 반환

예제 소스코드

컴파일 및 실행 결과

gcc hello_server.c -o hserver
./hserver 9190

9190은 서버가 사용할 포트 번호이다.

gcc hello_client.c -o hclient
./hclient 127.0.0.1 9190
Message from server: Hello World!

127.0.0.1은 서버의 IP주소, 9190은 PORT 번호이다.
127.0.0.1은 정확히 로컬 호스트의 주소이다. loopback 주소라고도 부른다.
전송하고자하는 주소가 loopback 주소라면 다른 네트워크로 패킷을 전송하지 않고 자기 자신한테 전달한다. 단지 패킷을 전송한 것 같은 시각을 제공한다.

profile
열심히 안 사는 사람

0개의 댓글