- 네트워크로 연결 되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것이다.
- 즉, 두 컴퓨터간 물리적으로 연결되어 있고 소프트웨어적인 데이터 송수신 방법을 통해 통신을 하는 것이다.
- 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치, 네트워크 망의 연결에 사용되는 도구이다.
- 운영체제에서 제공한다.
- 소켓을 생성하고 서버를 구현할 때 필요함 함수에 대한 설명
- 함수의 매개변수는 다음 챕터에서 자세히 알아가볼 예정이다.
- 소켓을 생성하는 함수이다.
1234567 #incude<sys/socket.h>// 리눅스int socket(int domain, int type, int protocal); // 성공 시 파일 디스크립터 반환, 실패시 -1 반환// 윈도우SOCKET socket(int af, int type, int protocal); // 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환cs
- socket 함수를 통해 만들어진 소켓에 주소정보를 할당하는 함수이다.
1234567 #incude<sys/socket.h>// 리눅스int bind(int sockfd, sturct sockaddr* myaddr, socklen_t addrlen) // 성공 시 0, 실패 시 -1 반환// 윈도우int bind(SOCKET s, const sturct sockaddr* name, int namelen); // 성공 시 0, 실패 시 SOCKET_ERROR 반환cs
- 소켓을 연결요청이 가능한 상태로 만들어주는 함수이다.
1234567 #incude<sys/socket.h>// 리눅스int listen(int sockfd, int backlog); // 성공 시 0, 실패 시 -1 반환// 윈도우int listen(SOCKET s, int backlog); // 성공 시 0, 실패 시 SOCKET_ERROR 반환cs
- 연결요청이 들어오면 응답하는 함수이다.
1234567 #incude<sys/socket.h>// 리눅스int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 성공 시 파일 디스크립터, 실패 시 -1 반환// 윈도우int accept(SOCKET s, struct sockaddr *addr, int *addrlen); // 성공 시 0, 실패 시 INVALID_SOCKET 반환cs
- 소켓생성 - socket 함수호출
- IP주소와 PORT번호 할당 - bind 함수 호출
- 연결요청 가능상태로 변경 - listen 함수 호출
- 연결요청에 대한 수락 - accept 함수 호출
위 과정을 실제로 실습해보자! 예제 코드는 윤성우 열혈 TCP/IP 소켓프로그래밍 예제 코드이다.
- 서버로 연결요청을 하는 함수이다.
1234567 #incude<sys/socket.h>// 리눅스int connect(int sockfd, struct sockaddr *serv-addr, socklen_t addrlen); // 성공 시 0, 실패 시 -1 반환// 윈도우int connect(SOCKET s, const struct sockaddr *addr, int *namelen); // 성공 시 0, 실패 시 SOCKET_ERROR 반환cs
- 소켓 생성 - socket 함수
- 연결요청 보내기 - connect 함수
위 과정을 실제로 실습해보자! 예제 코드는 윤성우 열혈 TCP/IP 소켓프로그래밍 예제 코드이다.
- 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수이다.
- 0 : 표준입렵(Standard Input)
- 1 : 표준출력(Standard Output)
- 2 : 표준에러(Standard Error)
- 3가지 파일 디스크립터는 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당된다.
- 운영체제가 만든 파일 또는 소켓의 지칭을 편히 하기 위해 사용한다.
- 데이터를 읽거나 쓰기 위해서 파일을 열 때 사용하는 함수이다.
1234567 #include<sys/types.h>#include<sys/stat.h>#include<fcnt.h>int open(const char *path, int flag); // 성공 시 파일 디스크립터, 실패 시 -1 반환// path : 파일 이름을 나타내는 문자열의 주소 값 전달// flag : 파일의 오픈 모드 정보cs
- 매개변수 flag에 들어갈수 있는 값들
- 비트 OR연산자로 묶어서 여러 개의 정보를 전달할 수 있다.
- O_CREAT : 필요하면 파일을 생성
- O_TRUNC : 기존 데이터 전부 삭제
- O_APPEND : 기존 데이터 보존, 뒤에 이어서 저장
- O_RDONLY : 읽기 전용으로 파일 오픈
- O_WRONLY : 쓰기 전용으로 파일 오픈
- O_RDWR : 읽기, 쓰기 겸용으로 파일 오픈
- 파일을 닫을 때 호출하는 함수이다.
- 파일뿐만 아니라, 소켓을 닫을 때도 사용된다.
1234 #include<unistd.h>int close(int fd); // 성공 시 0, 실패 시 -1 반환// fd : 닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달.cs
- 파일에 데이터를 출력(전송)하는 함수이다.
- 소켓을 통해서 다른 컴퓨터에 데이터를 전송할 때도 사용 가능하다.
123456 #include<unistd.h>ssize_t write(int fd, const void* buf, size_t nbytes); // 성공 시 전달한 바이트 수, 실패 시 -1 반환// fd : 데이터 전송대상을 나타내는 파일 디스크립터 전달.// buf : 전송할 데이터가 저장된 버퍼의 주소 값 전달.// nbytes : 전송할 데이터의 바이트 수 전달.cs
- 윈도우 소켓 기반의 데이터 전송하는 함수이다.
1234567 #include<winsock2.h>int send(SOCKET s, const char* buf, int len, int flags) // 성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환// s : 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달.// buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달.// len : 전송할 바이트 수 전달.// flags : 데이터 전송 시 적용할 다양한 옵션 정보 전달.cs
- 윈도우 소켓 기반의 데이터 수신하는 함수이다.
1234567 #include<winsock2.h>int recv(SOCKET s, const char* buf, int len, int flags) // 성공 시 수신된 바이트 수(단, EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환// s : 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달.// buf : 수신된 데이터를 저장할 버퍼의 주소 값 전달.// len : 수신할 수 있는 최대 바이트 수 전달.// flags : 데이터 수신 시 적용할 다양한 옵션 정보 전달.cs