Socket 

더보기


Socket 은 현실의 전화기와 같은 단말을 
프로그램 소스코드로 구현한 논리적 추상화 형태로, 

일반적인 모든 프로그램의 네트워크는 Socket 이라는 전 세계 소켓 인터페이스 기반으로 구현되어 있다.

  • C언어 POSIX 계열(Unix/Linux/BSD) 에 포함된 된 <sys/socket.h>

 

 

C, C++, C#, Java, Python, 웹, 모바일 등

모든 프로그래밍 언어마다 사용법이 상이한 네트워크 라이브러리 제공하더라도, 

Socket 이라는 표준 인터페이스를 조금 더 편리하게 사용하도록 발전된 형태의 라이브러리들에 불과하다. 

그렇기에 C#, Java, Python 도 C언어의 Low level Socket API 와 비슷한 형태를 띄고 있다.

  • C# → TcpClient, TcpListener, Socket
  • Java → ServerSocket, Socket
  • Python → socket 모듈, asyncio, http.server
    • 모두 소켓 API를 wrapping(래핑) 하여 사용 편의성을 높인 것에 불과하다.

 

 

하지만, 각 언어에서 제공하는 좀 더 발전된 형태의 라이브러리로 사용해 구현하는 것이 그 언어에 맞는 방법이다.

만약 C# 이라면, Socket 클래스를 사용하는 것보다 TCPClient, TCPListener 클래스를 사용하는 것이 권장된다. 

  • 예를 들어 C#에서는 Socket보다는 TcpClient와 TcpListener가
    리소스 관리, 스트림 처리, 비동기 제어 측면에서 더 적합하도록 생산성과 안전성을 높이기 위해 설계된 형태이다.

 


 

API

더보기

Application Program Interface

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


 

POSIX

더보기

Portable Operating System Interface for UniX

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

 

@발단

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

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

 

@노력

표준화의 필요성이 대두되었고, IEEE에서 POSIX 표준화 작업(1980년대 초) 을 추진

 

@결과

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

 

@효과

하드웨어, 운영체제, 공급 업체에 독립적이기 때문에

응용 프로그램의 이식성을 더 쉽게 얻을 수 있기에 개발자가 사용해야 한다.

 

1991년 등장한 Linux는 POSIX 표준을 대부분 구현한 오픈소스 운영체제로,
현재 서버, 임베디드, 스마트폰 등 다양한 분야에서 폭넓게 사용되고 있습니다.


 

IEEE (아이 트리플 이)

더보기

Institute of Electrical and Electronics Engineears

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


 

ANSI/ISO C언어 표준

더보기

처음 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>