#소켓
소켓 : 전구 갈을때 소켓을 갈아끼움.
인터넷상 - 자료를 주고 받는 등의 통신할 수 있도록 해주는 것.
인터넷을 통해 장시간 통신할때. 날코딩.
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() 함수 사용해서 해결 가능.