TCP/IP 알아가기 - 네트워크 프로그래밍과 소켓 이해

Coosla·2021년 9월 3일
0

TCPIP 알아가기

목록 보기
1/3

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

1-1. 네트워크 프로그래밍이란?

  • 네트워크로 연결 되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것이다.
  • 즉, 두 컴퓨터간 물리적으로 연결되어 있고 소프트웨어적인 데이터 송수신 방법을 통해 통신을 하는 것이다.

1-2 소켓이란?

  • 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치, 네트워크 망의 연결에 사용되는 도구이다.
  • 운영체제에서 제공한다.

2. 서버 구현에 필요한 함수들

  • 소켓을 생성하고 서버를 구현할 때 필요함 함수에 대한 설명
  • 함수의 매개변수는 다음 챕터에서 자세히 알아가볼 예정이다.

2-1. socket 함수

  • 소켓을 생성하는 함수이다.
1
2
3
4
5
6
7
#incude<sys/socket.h>
 
// 리눅스
int socket(int domain, int type, int protocal); // 성공 시 파일 디스크립터 반환, 실패시 -1 반환
 
// 윈도우
SOCKET socket(int af, int type, int protocal); // 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환
cs

2-2 bind 함수

  • socket 함수를 통해 만들어진 소켓에 주소정보를 할당하는 함수이다.
1
2
3
4
5
6
7
#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

2-3 listen 함수

  • 소켓을 연결요청이 가능한 상태로 만들어주는 함수이다.
1
2
3
4
5
6
7
#incude<sys/socket.h>
 
// 리눅스
int listen(int sockfd, int backlog); // 성공 시 0, 실패 시 -1 반환
 
// 윈도우
int listen(SOCKET s, int backlog); // 성공 시 0, 실패 시 SOCKET_ERROR 반환
cs

2-4 accept 함수

  • 연결요청이 들어오면 응답하는 함수이다.
1
2
3
4
5
6
7
#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

2-5 서버 프로그램 구현 과정

  1. 소켓생성                           - socket 함수호출
  2. IP주소와 PORT번호 할당       - bind 함수 호출
  3. 연결요청 가능상태로 변경     - listen 함수 호출
  4. 연결요청에 대한 수락           - accept 함수 호출

위 과정을 실제로 실습해보자! 예제 코드는 윤성우 열혈 TCP/IP 소켓프로그래밍 예제 코드이다.


3. 클라이언트 구현에 필요한 함수들

3-1. connect 함수

  • 서버로 연결요청을 하는 함수이다.
1
2
3
4
5
6
7
#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

3-2 클라이언트 프로그램 구현 과정

  1. 소켓 생성            - socket 함수
  2. 연결요청 보내기   - connect 함수

위 과정을 실제로 실습해보자! 예제 코드는 윤성우 열혈 TCP/IP 소켓프로그래밍 예제 코드이다.


4. 리눅스에서 파일 조작하기

4-1 파일 디스크립터

  • 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수이다.
    • 0 : 표준입렵(Standard Input)
    • 1 : 표준출력(Standard Output)
    • 2 : 표준에러(Standard Error)
  • 3가지 파일 디스크립터는 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당된다.
  • 운영체제가 만든 파일 또는 소켓의 지칭을 편히 하기 위해 사용한다.

4-2 open 함수

  • 데이터를 읽거나 쓰기 위해서 파일을 열 때 사용하는 함수이다.
1
2
3
4
5
6
7
#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 : 읽기, 쓰기 겸용으로 파일 오픈

4-3 close 함수

  • 파일을 닫을 때 호출하는 함수이다.
  • 파일뿐만 아니라, 소켓을 닫을 때도 사용된다.
1
2
3
4
#include<unistd.h>
 
int close(int fd); // 성공 시 0, 실패 시 -1 반환
// fd : 닫고자 하는 파일 또는 소켓의 파일 디스크립터 전달.
cs

4-4 write 함수

  • 파일에 데이터를 출력(전송)하는 함수이다.
  • 소켓을 통해서 다른 컴퓨터에 데이터를 전송할 때도 사용 가능하다.
1
2
3
4
5
6
#include<unistd.h>
 
ssize_t write(int fd, const void* buf, size_t nbytes); // 성공 시 전달한 바이트 수, 실패 시 -1 반환
// fd : 데이터 전송대상을 나타내는 파일 디스크립터 전달.
// buf : 전송할 데이터가 저장된 버퍼의 주소 값 전달.
// nbytes : 전송할 데이터의 바이트 수 전달.
cs

5. 윈도우에서 파일 조작하기

5-1 send 함수

  • 윈도우 소켓 기반의 데이터 전송하는 함수이다.
1
2
3
4
5
6
7
#include<winsock2.h>
 
int send(SOCKET s, const char* buf, int len, int flags) // 성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환
// s : 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달.
// buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달.
// len : 전송할 바이트 수 전달.
// flags : 데이터 전송 시 적용할 다양한 옵션 정보 전달.
cs

5-2 recv 함수

  • 윈도우 소켓 기반의 데이터 수신하는 함수이다.
1
2
3
4
5
6
7
#include<winsock2.h>
 
int recv(SOCKET s, const char* buf, int len, int flags) // 성공 시 수신된 바이트 수(단, EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환
// s : 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달.
// buf : 수신된 데이터를 저장할 버퍼의 주소 값 전달.
// len : 수신할 수 있는 최대 바이트 수 전달.
// flags : 데이터 수신 시 적용할 다양한 옵션 정보 전달.
cs

profile
프로그래밍 언어 공부 정리

0개의 댓글