새소식

C#/Network

1. 소켓 네트워크

  • -

 

Socket


Socket

 

Socket은 단말(eg. 전화기)을 논리적으로 추상화한 형태로, 일반적인 프로그램의 네트워크 기능은 Socket 표준 기반으로 구현되어 있다.

 

C, C++, C#, Java, Python 등 프로그래밍 언어에서 사용하는 네트워크 라이브러리는 내부적으로 Socket 표준을 기반으로 한다. 그 중, 가장 기반이 되는 Low level Socket API 는, C언어 POSIX library 에 포함된 된 <sys/socket.h> 이다.

 

프로그래밍 언어마다 사용법이 상이한 네트워크 라이브러리 제공하더라도,  Socket 을 조금 더 편리하게 사용하도록 발전된 형태의 라이브러리들에 불과하다. 그렇기에 C#, Java, Python 도 C언어의 Low level Socket API 와 비슷한 구현이 가능한 방법을 제공한다.

 

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

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

 

 

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가 발전하고, 다양한 컴퓨터 시스템에 널리 사용되면서 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# 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

 

WSA

Windows Socket API (Winsock)

1991년 시작된 윈도우 소켓 프로젝트는 버클리 유닉스 (BSD Unix) 소켓 인터페이스를 윈도우용으로 개조하여  거의 모든 특징을 포괄한다.

 

하지만 윈속의 사용방법과 문법이 BSD 소켓의 경우와 유사하기는 하더라도 윈속과 BSD 소켓용으로 작성된 프로그램은 서로 호환성이 없으며 이 두 가지 소켓 응용 프로그램이 호환성을 갖으려면 많은 부분을 수정하여야 한다.

유닉스 Socket API C언어 소켓 로직윈도우 WinSock2 API C언어 소켓 로직은 호환되지 않으므로, 별도로 구현하여 호환성 작업야 한다. 

 

초기 윈속(WinSock 1.1 )은 winsock.dll 의 형태로 설치되어 사용하였고, Windows 95에서 OS의 일부로 추가되었으며, 현재는 윈속2(WinSock 2.x)를 사용하고 있다.

일반적으로 C/C++ 프로그램에서 WinSock API를 사용한다.

 

 

C# .NET 네트워크 클래스

.NET Framework은 WinSock API 를 사용하기 위해 Wrapper 클래스들을 제공한다.

핵심 클래스로 System.Net.Sockets 네임스페이스의 TcpClient, TcpListner, UdpClient, Socket 클래스들이 있다.

 

 

소켓 통신 실행 흐름

클라이언트(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) 클라이언트 소켓은, 서버와 연결 된 뒤, 별도의 소켓을 생성하지 않고, 같은 소켓을 사용한다.  

 

 

소켓 통신과 비동기

Contents

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

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