본문 바로가기

Lobo's study room/TCP, IP 소켓 프로그래밍

인터넷 통신 모델, system call VS LIbrary 함수

#소켓

소켓 : 전구 갈을때 소켓을 갈아끼움. 

인터넷상 - 자료를 주고 받는 등의 통신할 수 있도록 해주는 것.

인터넷을 통해 장시간 통신할때. 날코딩. 

ex)json.html.

 

#select 함수

select함수를 쓰면 멀티프로세서 멀티쓰레드를 쓰지 않아도 되나 대용량서버의 경우 성능이 나쁨

예전 게임서버 -윈도우.. IO이용 

 

#인터넷 통신

어떻게 하면 효율적으로 속도를 빠르게 할 수 있을까!?

 

TCP/UDP 

 

국방부의 아르파넷 - 인터넷의 전신.

장비들간 통신하기 위한 여러 가지 규칙을 프로토콜(약속)이라 한다.

 

버클리BSD계열 UNIX :

인터넷에서 통신하기 위해 제안한 Socket model - 표준화되었다.

 

C언어가 만들어진 계기: 어셈블리보다 사람이 프로그래밍하기 쉽고 효율적인 'C'언어를 만들어냄.

 

#Server - Client model

(일본에서 먼저 사용된 용어) : socket model도! 이 방식

웹 클라우드나 웹브라우저 같은 서버에 클라이언트가 httP 프로토콜을 이용해서 요청을 하면 웹서버에서는 HTML 문서를 만들어내고 INDEX.HTML문서를 CLIENT에게 제공해준다.

 

서버 : 웹 클라우드, 웹브라우저

요청:http://www. 해당 웹주소로 접근해서 http프로토콜 이용 HTML문서를 제공해달라고 요청 ->

접근:웹서버에서 html문서 전송 -> 응답 : index.html 문서.

 

#분산환경(distributed environment)

(미국에서 먼저 사용된 용어)

Server-client model = distributed environment

다중 Client(multi Client)

순차적으로 제공하면 마지막 사용자에게는 지연 시간이 발생한다.

서버쪽에서 내부적으로 분신을 한다면?! 순차적으로 처리하되 cpu를 쪼개서 client들에 대응을 해주면

순차적으로 처리는 되지만 동시에 처리하는것처럼 효과를 낼 수 있다.

들어온 작업 순서대로가 아니라 시간을 쪼개서 각각의 작업에 cpu 시간을 할당해주면 동시에 처리되는 것처럼 보임

 

context-switching :

다음 작업으로 넘어갈때 해당 작업 내용을 저장했다가 넘어가고,다시 차례가 왔을때 이전에 있었던 상황을 복구하고 동작하는 과정에서 overhead가 발생이 될 수 도 있다.

우선 순위가 높은 작업이 들어올때 우선 순위가 낮은 상태는 잠시 멈췄다가 메모리상태를 저장해놓고 우선 순위가 높은 작업을 먼저 끝내고 다시 진행하는 것!

저장과 복구하는 과정을 거쳐야 함으로 원래 작업보다는 좀 더 오래 걸릴 수 있다.

 

#Operating System

컴퓨터에서 동시에 여러개의 프로그램을 작동시키는 것!

 

예전에는 하드웨어의 사양이 낮았기때문에 실패.

 

운영체제의 출발은 멀틱프로그램. 어떻게 하면 효율적으로 컴퓨터를 사용할수 있을까?

job batch system -> 순서대로 먼저 들어오는 것을 먼저 처리.

 

우선순위가 낮은 작업 우선순위가 높은 작업

batch system에서는 기다려야함.

 

#타임시분할

메모리에 작업 3개를 동시에 올려놓고… 시간을 단위시간으로 쪼개서 서비스.

장점-동시에 실행되는것처럼 보임

복잡해지면 운영체제의 도움을 받는다.

단점-context-switching overhead.

 

#TCP Socket model



bind()=>IP주소, 포트번호

 

IP주소:컴퓨터 주소

포트번호:컴퓨터 안에서 특정 프로그램 찾아갈때65356 2^16 (2바이트)

 

listen()=>소켓만들면 데이터를 전송하는 데이터 소켓이 만들어지는데 이 것을 listen socket으로 바꿔준다.

 

★accept()=>1)blocking 함수 2)data socket 생성

 

read/write - send/receive

데이터 소켓 만들고 서버쪽으로 connecting.

 

read함수가 blocking함수(데이터가 들어올때까지 기다리는 것)와 non blocking 함수(무한루프)

 

blocking 함수의 경우 client에서 connect할때까지 기다린다.

 

1.blocking 함수

n=read(-); //block

2.non blocking 함수

while(I){
if(n=read(-))0)
break; } //non breaking

 

accept소켓은 클라이언트와 소통할 수 있는 데이터 소켓을 새로 생성

 

listen socket을 쓰는 이유는? 다중클라이언트 처리할때 진입점.

 

프로세스 하나 쓰레드 여러개 -> 오버헤드 줄일수 있다.

멀티프로세스 -> 멀티쓰레드

 

#System Call vs Library 함수

 

*System Call : UNIX

API(application program interface) 함수(windows)

운영체제의 리소스를 활용할 수 있도록 운영체제에서 직접적으로 제공하는 c스타일의 함수

ex)파일을 다루는데 open(), close(), read(), write(), ioctl() 등이 system call에 대응된다.

 

*Library 함수 : fopen(), fclose(), fprintf(), fscanf()

 

 

library함수를 사용하는게 편리하다.

리눅스-api, window-system call

 

소켓을 파일의 개념으로 다룬다.

리눅스에서는 모든 장치를 파일의 개념으로 다룬다.

 

리눅스에서 제공하는 system call로 파일의 개념으로 장치를 다룬다 : open(), close(), read(), write(), ioctl()

 

리눅스에서 장치 입출력시스템을 만든다는것은 system call로 함수 만들어주는것!

 

#socket 함수 사용법

TCP는 패킷이 유실되면 다시 보내줌/ UDP는 다시 보내주지 않음.

패킷이 유실되도 문제가 생기지 않는 스트리밍 서비스에서는 UDP소켓을 쓴다.

 

#file descriptor

 opened 파일에 대한 정보를 가지는 배열의 index값

file을 열면 file descriptor에 값 저장.

기본적으로는 3이라는 값 사용.

 

#bind()

 

#server.c

big endian(우리가 생각하는 순서대로 들어가는것) 과 little endian(거꾸로 들어가는것)

by directional endian(혼합해서 사용)

network은 big endian

host to network => big endian으로 변환. 4byte짜리 정수형을 big endian으루

str to s => 2byte 정수를 little endian으로

n to h = > big endian이면 안바꾸고, short면 little endian으로 바꿔줌

 

#listen()

 

#accept()

return 값은 data 소켓 값.

주소 변수를 넘겨주면 connect한 client쪽 주소로 채워주고 굳이 주소를 쓰기 싫다면 null로 

 

#쓰레드

실행흐름:쓰레드/ 쓰레드를 여러개 -> 동시실행

쓰레드의 실행단위는 함수

일반적으로 쓰레드에 의해 호출되는 함수들은 전역변수를 쓴다.

 

#pthread_create

사용자 정의함수를 함수인자로 전달할때 포인터를 쓴다

임의의 인자를 함수 pointer로 전달할때 void 포인터를 쓴다

 

#read

호출하는 쪽에 있는 변수값을 호출당하는 쪽에서 불러올수 있다.

리턴값 : 읽은 데이터의 개수

ssize_t unsigned에 sign을 붙여준것! read함수가 제대로 동작하면 몇개의 데이터를 읽었는지 개수 리턴. if not -1리턴.

실제결과값은 인자를 통해 넘기고 동작여부확인은 return을 써서 확인

read함수의 세번째인자는 최대로 받을수 있는 크기! 무조건인 사이즈 아니다.

내부적인 상황에 따라서 쪼개서 읽을 수 있다.

 

#connect

#undefined reference to 'p thread_create' error

쓰레드는 기본 라이브러리 아님. 사이즈 너무 커서.

외부라이브러리라 필요할때 가져다 쓰는 거니까.

c언어 math.h 수학관련함수 / windows - 기본 라이브러리/ 리눅스-외부라이브러리

리눅스 -lm …. / 지금은 또 다름

#서버-바인드 ERROR

서버-바인드 에러 해결 / set socket opt() 함수 사용해서 해결 가능.