본문 바로가기

소켓프로그래밍 6

소켓 프로그래밍 - Connected UDP Unconnected UDP 소켓의 sendto() 호출과정 ① UDP소켓에 목적지의 IP와 포트번호 등록 ② 데이터 전송 ③ UDP 소켓에 등록된 목적지 정보 삭제 Connected UDP 소켓 - connect() 호출로 소켓에 IP와 포트번호 할당 → 커널과 소켓간 연결 상태 유지(read() / write() 사용 가능) - 매회 목적지 주소정보 등록 및 삭제 과정 불필요 - UDP 소켓으로 하나의 호스트와 오랜 시간 데이터를 송수신 해야할 때 효율적 Connected UDP Socket //Connected UDP Socket #include #include #include #include #include #include #define BUF_SIZE 30 void error_handling(c.. 2020. 12. 13.
소켓프로그래밍 - UDP 소켓 UDP 소켓 특성 - 흐름제어 flow Control이 없음(SEQ, ACK과 같은 메시지 전달 X) - 연결 설정과 해제 과정 존재 X → connect(), listen(), accept() 필요 X - 데이터의 분실 및 손실 위험 존재. 빠른 데이터 전송 UDP의 데이터 송수신 - UDP는 연결의 개념 존재 X → 서버 소켓과 클라이언트 소켓의 구분 X → connect(), listen(), accept() 불필요 - 하나의 소켓으로 둘 이상의 영역과 데이터 송수신 가능(sendto(), recvfrom()) UDP 기반 소켓 API(시스템 콜 호출) 흐름 ※ 서버 소켓: socket() → bind() → recvfrom() → sendto() → close() ※ 클라이언트 소켓: socket.. 2020. 12. 13.
소켓 프로그래밍 - TCP 소켓(입출력 버퍼, Half-close) 데이터 입출력(read() / write() 호출) - write()가 호출되는 순간, 데이터는 출력버퍼로 이동 - read()가 호출되는 순간, 입력버퍼에 저장된 데이터를 읽음 입출력 버퍼 - TCP 소켓 각각에 대해 별도로 존재 - 소켓 생성 시 자동으로 생성 - 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄짐 → 데이터 송신 보장 - 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸됨 → 데이터 수신 보장X - 슬라이딩 윈도우 프로토콜 적용이 가능해짐 TCP 내부동작 ① 소켓과의 연결(3-WAY) : SYN → SYN+ACK → ACK ② 데이터 송수신 : ACK 번호 = SEQ 번호 + 전송된 바이트 크기 +1 ③ 연결종료(4-WAY) : FIN → ACK. FIN→ ACK clo.. 2020. 12. 13.
소켓 프로그래밍 - 어플리케이션 프로토콜 어플리케이션 프로토콜 목적에 맞는 프로그램을 구현하기 위하여 서버와 클라이언트 간 송수신 데이터 사이즈와 송수신 데이터의 끝을 정의 계산기 프로그램 구현(어플리케이션 프로토콜) - 클라이언트는 서버에 접속하자마자 피연산자의 개수정보를 1바이트 정수형태로 전달 - 클라이언트가 서버에 전달하는 정수 하나는 4바이트 - 정수를 전달한 다음에는 연산의 종류(+, -, *)를 전달. 연산정보는 1바이트 - 서버는 연산결과를 4바이트 정수의 형태로 클라이언트에게 전달 - 연산결과를 얻은 클라이언트는 서버와의 연결 종료(EOF) 계산기 프로그램 데이터 구조 계산기 프로그램 Server //TCP 산술연산 처리 서버 #include #include #include #include #include #include #de.. 2020. 12. 13.
소켓 프로그래밍 - 연결지향형 소켓(TCP 소켓) 서버 프로그램(데이터 전송) // tcp_server #include #include #include #include #include #include #include void error_handling(char *message); { int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; socklen_t clnt_addr_size; char message[]="This is tcp server socket test!"; if(argc!=2) { printf("Usage: %s \n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0);/.. 2020. 12. 12.
소켓 프로그래밍 - 파일 디스크립터 파일 디스크립터 - 시스템으로부터 할당받은 파일 또는 소켓에 부여된 정수 - 저수준 파일 입출력 함수(open, close)에게 소켓의 파일 디스크립터 인자를 전달하면, 소켓을 대상으로 입출력 진행 파일 디스크립터 대상 0 표준입력: Standard Input 1 표준출력: Standard Output 2 표준에러: Standard Error 파일입출력 함수 * 파일 열기: open() #include #include #include // 성공 시 파일 디스크립터, 실패 시 -1 반환 int open(const char *path, int flag); // *path: 파일의 이름 및 경로정보 // flag: 파일의 오픈모드 오픈모드(flag 값) 의미 O_CREAT 필요하면 파일 생성 O_TRUNC 기.. 2020. 12. 12.