본문 바로가기

CS/컴퓨터 네트워크

실습 1-1. 네트워크 프로그래밍과 소켓

 

* 네트워크 프로그래밍

네트워크로 연결된 둘 이상의 컴퓨터 사이에서의 데이터 송수신 프로그램의 작성

소켓을 기반으로 프로그래밍을 해서 소켓프로그래밍이라고도 함

 

*소켓

네트워크 연결 도구

운영체제에 의해 제공되는 소프트웨어적인 장치 (unix 소켓, windows 소켓)

소켓은 프로그래머에게 데이터 송수신에 대한 물리적, 소프트웨어적 세세한 내용을 신경쓰지 않게함

 

*소켓을 전화에 비유

소켓은 socket함수의 호출을 통해서 생성

전화를 거는 용도의 소켓과 전화를 수신하는 용도의 소켓으로 구분됨

 

[전화를 수신하는 용도의 소켓] : 리스닝 소켓, 서버 소켓

 

- 소켓 생성

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

 성공 시 파일 디스크립터를 반환하고 실패 시 -1을 반환

 

- 소켓 주소 할당

전화기의 전화번호처럼 소켓에도 주소정보를 할당

소켓의 주소정보는 IP와 port번호로 구성 (port는 IP와 매칭해서 어플리케이션을 구분하는 거라고 함)

#include <sys/socket.h>
int bind(int sockfd, struct sockaddr "myaddr", socklen_t addrlen)

성공 시 0, 실패 시 -1 반환

 

- 연결

연결 요청이 가능한 상태의 소켓을 전화를 받을 수 있는 상태에 비유할 수 있음

전화를 거는 용도의 소켓은 연결요청이 가능한 상태가 될 필요는 없음

전화를 받는 용도의 소켓은 연결요청이 가능한 상태가 필요

#include <sys/socket.h>
int listen(int sockfd, int backlog);

성공 시 0, 실패시 -1 반환/ 소켓에 할당된 ip와 port번호로 연결요청이 가능한 상태가 됨

 

- 연결요청 수락

연결요청이 수락되어야 데이터 송수신이 양방향으로 가능

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);

성공 시 파일 디스크립터를 반환하고 실패 시 -1 반환

accept 함수 호출 이후에는 데이터의 송수신이 가능

단, 연결요청이 있을 때에만 accept 함수를 반환할 수 있음

 

소켓생성(socket함수) -> ip와 port번호 할당(bind함수)

-> 연결요청 가능상태로 변경(listem함수) ->연결요청 수락(accpet함수)

 

[전화를 거는 소켓]

소켓의 생성과 연결의 요청으로 구분

소켓의 생성은 서버 소켓처럼 socket함수를 사용하면 됨

 

-연결 요청

#include <sys/socket.h>
int connect(int sockfd, struct sockaddr* serv_addr, socklen_t addrlen);

성공 시 0, 실패 시 -1 반환