새소식

C, C++/C TCP, IP

1.1 Socket Networking

  • -

Networking

네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 하는 것

물리적인 연결이 필요하다.


 

Socket

 

Socket 은 단말(eg. 전화기)을 논리적인 소스코드로 추상화한 형태다.

일반적인 컴퓨터에서 다루는 모든 프로그램의 네트워크는C언어 POSIX library 의 <sys/socket.h> 기반이다.

Socket 표준 이라고 한다.

 

C, C++, C#, Java, Python 등 프로그래밍 언어에서 사용하는 네트워크 라이브러리도 마찬가지다.

내부적으로 Socket 표준을 기반으로 조금 더 편리하게 사용하도록 발전된 형태의 라이브러리들에 불과하다.

  API / 클래스 설명 제공 기능 OS/PL
Unix Socket API 네트워크 표준 API Low Level 의 소켓 프로그래밍

TCP, UDP 등 다양한 네트워크에 사용
Unix(+ Ubuntu, Redhat..)
Window WinSock2 API Socket API 윈도우 버전 Window(C/C++)
C#
.NET
Sockets WinSock2 API C# 버전 Sockets 닷넷은 WinSock2 API 호출 Window(C#)
TcpClient 내부적으로
Sockets 클래스 사용
TCP, UDP 전용
TcpListner
UdpClient

 

더보기

API

Application Program Interface

운영체제와 응용프로그램 사이의 통신에 사용되는 언어나 메시지를 뜻한다.

 

 

POSIX (퍼식스)

Portable Operating System Interface for UniX

이식 가능 운영 체제 인터페이스

 

1960년대 후반 개발된 UNIX는 다양한 형태로 발전하여, BSD나 System V 등 여러 운영체제로 발전했다. 

이러한 다양한 형태의 UNIX 계열 운영체제의 등장은 운영체제 간 호환성과 이식성에 어려움을 주기 시작했다.

서로 다른 UNIX OS의 공통 API를 정리하여 응용 프로그램과 운영체제 간의 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE 가 책정한 애플리케이션 인터페이스 규격으로 <sys/socket.h> 와 같은 라이브러리를 포함한다.

 

하드웨어, 운영체제, 공급 업체에 독립적이기 때문에 응용 프로그램의 이식성을 더 쉽게 얻을 수 있기에 개발자가 사용해야 한다.

 

1991년, 이러한 POSIX 표준을 만족하는 Linux가 탄생했고 아직까지도 오픈소스 소프트웨어로 스마트폰, 임베디드 기기 등 다양한 분야에서 널리 사용되고 있다.

 

 

IEEE (아이 트리플 이)

Institute of Electrical and Electronics Engineears

미국 표준 협회(ANSI)에 의해 국가 표준 개발을 위촉받은 미국 전기 전자 학회

 

 

ANSI/ISO C언어 표준 (엔시 아이에스오)

 

처음 C 언어에 대한 마땅한 표준이 없어 Unix와 함께 제공됐던 라이브러리(POSIX)가 사실상 표준이나 마찬가지 였다.

 

처음 C 언어에 대한 마땅한 표준이 없어 Unix와 함께 제공됐던 라이브러리(POSIX)가 사실상 표준이나 마찬가지 였다. C가 발전하고, 다양한 컴퓨터 시스템에 널리 사용되면서 C 언어는 1983년 미국표준협회(ANSI)에서 새로운 표준을 제안한다.  

 

1989년에 정식으로 채택되었으며, 이 표준(ANSI C)은 C 언어와 C 라이브러리를 함께 정의하고 있다. 1990년, 국제표준화기구(ISO)에서도 C 표준(ISO C)을 채택한다. ISO C와 ANSI C는 사실상 같은 표준을 가리킨다. 흔히 사람들이 ANSI C라고 부르는 것은, ANSI 버전이 더 먼저 나왔기 때문이다.

 

POSIX C언어 Interface 규격 ANSI/ISO C언어 표준
<aio.h>  <arpa/inet.h>  <assert.h>  <ctype.h>  
<dirent.h> <dlfcn.h>  <fcntl.h>  <fmtmsg.h>  
<fnmatch.h>  <ftw.h> <glob.h>  <grp.h>
<iconv.h>  <langinfo.h>  <libgen.h> <monetary.h>
<mqueue.h>  <ndbm.h>  <net/if.h>  <netdb.h>
<netinet/in.h>  <netinet/tcp.h>  <nl_types.h>  <poll.h>
<pthread.h> <pwd.h>  <regex.h>  <sched.h>
<search.h>  <semaphore.h> <spawn.h>  <strings.h>  
<stropts.h>  <sys/ipc.h>  <sys/mman.h> <sys/msg.h>  
<sys/resource.h>  <sys/select.h>  <sys/sem.h>  <sys/shm.h>
<sys/socket.h>  <sys/stat.h>  <sys/statvfs.h>  <sys/time.h>
 
<sys/times.h> <sys/types.h>  <sys/uio.h>  <sys/un.h>  
<sys/utsname.h>  <sys/wait.h> <syslog.h>  <tar.h>
 
<termios.h>  <trace.h>  <ulimit.h> <unistd.h>  <utime.h>
 
<utmpx.h>  <wordexp.h>
<assert.h>  <complex.h>  <ctype.h>  <errno.h>

 
<fenv.h> <float.h>  <inttypes.h>  <iso646.h>

<limits.h>  <locale.h> <math.h>  <setjmp.h>  

<signal.h>  <stdarg.h>  <stdbool.h> <stddef.h>  

<stdint.h>  <stdio.h>  <stdlib.h>  <string.h>

<tgmath.h>  <time.h>  <whcar.h>  <wctype.h>
 

 


 

클라이언트-서버 통신 모델

 

대부분 네트워크 프로그램은 클라이언트-서버(C/S) 모델로 구현되는데 서비스를 받는 클라이언트의 요구(request)에 대하여 서비스를 제공하는 서버가 응답(response)을 보내는 방식으로 동작이 이루어진다.

 


 

소켓 통신 실행 흐름

클라이언트(Client) 흐름 서버(Server) 흐름
[1]생성 1. 클라이언트 소켓3) 생성 [1]생성  1. 서버 소켓*1) 생성
    [2]결합 2. 서버 소켓에 IP 주소와 Port 번호 결합
    [3]대기 3. 클라이언트 요청 대기
[2]연결 2. 서버로 연결 요청    
    [4]수락 4. 클라이언트 요청 정보와 서버 소켓 정보를 결합해  연결 소켓*2)을 생성 
[3]송수신 3. 서버 소켓에서 연결 수락 후, 데이터 송수신 [5]송수신 5. 연결 소켓을 통한 데이터를 송수신
[4]닫음 4. 통신이 완료되면, 소켓 닫음 [6]닫음 6. 통신이 완료되면, 연결 소켓을 닫음

* 2) 연결 소켓은, 서버 소켓에서 클라이언트와 연결된 연결 소켓으로 서버 소켓과 다르다.

* 1)서버 소켓은, 일반적으로 다수의 클라으언트 소켓으로부터 연결 요청을 받는다.

* 3) 클라이언트 소켓은, 서버와 연결 된 뒤, 별도의 소켓을 생성하지 않고, 같은 소켓을 사용한다.  


 

네트워크 프로그래밍의 분류

 

1. 응용 계층 프로그래밍

▶ 컴퓨터 시스템이 지원하는 네트워크 유틸리티, 응용 프로그램을 활용한 프로그래밍 인터페이스를 제공
▶ 웹(web)의 HTML(Hyper Text Markup Language) 등

 

2. 트랜스포트, 인터넷 계층 프로그래밍

▶ 트랜스포트 계층을 이용해 호스트 종점간의 연결을 직접 관리하고 패킷 단위의 데이터 송수신을 제어
▶ 대표적으로 Socket API(Application Program Interface)를 이용
▶ 소켓 API는 운영체제에 따라 UNIX BSD(Berkeley Software Distribution) socket(1982년), 윈도우 소켓(Winsock, 1992년) 등이 있으며, 현재는 컴퓨터 기종 및 운영체제에 무관하게 대부분의 TCP/IP를 제공하는 컴퓨터에서는 기본적으로 지원

 

3. 디바이스 계층 프로그래밍

▶ OSI(Open System Interconnection)의 계층 2 이하의 인터페이스, 즉 링크 계층이나 하드웨어 디바이스를 구동하여 프레임 단위의 데이터 송수신을 직접 다루는 프로그래밍
▶ 프레임을 전송 또는 수신하는 단순한 기능만 제공하므로 흐름제어, 오류제어, IP 주소 관리와 같은 기능은 사용자가 별도로 구현 필요

 

 

 

출처 & 참고

1. recipes4dev.tistory.com/153

2. 윤성우 열혈 TCP IP 소켓 프로그래밍 Ch. 01

3. 네트워킹 강좌

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.