네트워크 프로그래밍
옆친구 온도 센서, 모터 등을 돌리고 싶을때 => 휴대폰 접속할 수 있어야
int softToneCreate (int pin) ;
This creates a software controlled tone pin. You can use any GPIO pin and the pin numbering will be that of the wiringPiSetup() function you used.
The return value is 0 for success. Anything else and you should check the global errno variable to see what went wrong.
http://wiringpi.com/reference/software-tone-library/
int softToneCreate (int pin) ;
pin: 사용할 gpio번호
return type이 int임
줄 값이 있다는 뜻이다.
리눅스에 저장되어 있는 값
0이 호출되지 않으면 실패함.
해당 핀을 다른 용도로 사용하고 있는 경우가 실패 요인이겠지?
output mode이어야 함.
1초 동안 소리를 내고 싶다면?
내부적으로 thread을 만든다.
소리나는 것을 돌리고 있음
한번 해보기.
통신하는 프로그램 만들어보자
어떤형식으로 동작?
=> 1:다 관계임. 서버는 클라이언트에게 요청을 할 수 없음. 서버는 많은 클라이언트와 이야기를 해야!
복잡성을 줄이기 위해 => cs 모델을 사용함
cs모델과 반대인 개념.
어떤 사람이든 원할 때 데이터를 띄울 수 있다.
보편적으로 cs 모델을 사용한다.
신뢰성 체크(ack확인..)
Layer 3 network
ip(forwarding)
L4
라즈베리파이 vs 800만원 컴퓨터
배려하는 마음으로 데이터를 주고받으면서 상대방이 잘 받을 수 있는지 체크
=> 흐름 체크
port 번호 필요
웹서버: 80번
ssh: 22번
80번 웹이 사용중..
www.naver.com => dns => ip 접속
접속후 어떤 포트 사용?
ssh pi@ip주소:port
ssh가 사용하는 포트 정해져있음
정해져있는 포트는 사용하면 안됨.
0~1023까지 정해져 있는 포트임 => well known port
ex) 21번 ftp
22번 ssh
23번 텔넷
25번 smp(email protocol)
80번 web
ip주소: 32비트(long타입)
포트: 16비트 (short타입)
=> 0~65535까지 사용가능
1024~65535까지 사용가능한 포트 번호임=> user defined port
L5
session
가상의 connection 위에서 데이터 주고받음
L6
표현의 포맷을 맞추자
Presentation
L7
애플리케이션. 최상단
표준 api를 만들어보자 => socket(bsd) programing
L1~L4까지는 정형화되어있음.
소켓에서 미리 다 짜놓고 필요한 것만 사용자에게 입력받음.
사용자는 맞춰서 정보만 제공하면 됨.
소켓 API에 파라미터만 잘 맞추면 된다.
Sever
↓
socket()
↓
bind()
↓
listen()
↓
accept()
↓
read()
↓ 반복
write()
↓
close()
Client
socket()
↓
connect()
↓
write()
↓ 반복
read()
↓
close()
=> connection established
Tx
Rx
서버는 읽기만 가능해야!
파일입출력
fopen함
file형 포인터 리턴
다음부터 파일을 접근하기위해서는 그 포인터를 사용하겠음
open
(File Descriptor)
https://twofootdog.tistory.com/51
과 비슷함
내부적으로 소통할수 있는 정보꾸러미 만들어서 정보꾸러미에 접속할 수 있는 주소 알려줌.
create endpoint => 정보꾸러미를 만들어서 접근할 수 있는 번호

AF_LOCAL 사용
define sys로 사용가능


domain : AF_INET
type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP), SCTP...
특별할 거 쓸필요는 없음. 쓸거 없다면 0을 넣으면 된다.
file desciptor => pointer x, 번호임
88번과 같이 unique한 번호
파일, 소켓, 디바이스 접속 등 유닉스에선 모두 fd로 소통됨(모든 fd는 유니크하다)
포트는 sender 포트(source, 내가 보내는 포트-내가 지우면 된다), receive 포트
클라이언트는 먼저 쏘지, 쏘임을 받지 않음.
(만약 p2p의 경우는 둘다 bind 필요)
시스템상으로 빈 포트를 예약하기 때문에, 중복될 일은 없음
listen(): tcp 초기 window 크기 지정
슬라이딩 윈도우
ack가 안오면 줄이고, 또 올리고, ..
초기에 윈도우라고 하는 것(데이터를 하나를 보낼지, 5로 보낼지, ..을 통해 tcp 에서 운영)
윈도우 값을 뭐로 잡아야 돼?
accept(): 접속을 받기 위함(client로부터 connect() 받음)
close(): 생성된 소켓 파기 + 접속종료
socket(): 서버와 동일
connect(): 접속 요청(client=>서버)
close: 서버와 동일
멍텅구리 같은 삶보다는 내부원리를 알자.
tcp에서 접속 =>
tcp에서 어떻게 connect establish?
server - client
tcp 접속(establishment)
1. synk(세그먼트)를 보낸다.
2. 서버에서 client로 synk+ack를 보낸다.
3. client에서 ack를 보낸다.
appect()-connect()
데이터를 보내고 ack를 받으면 된다.
몇개를 보내고 ack를 받느냐가 슬라이딩 윈도우의 윈도우 갯수임!
=> listen()에서 지정(window 크기 지정)
write() => read()
write함수에 내가 보낼 함수의 포인터만 넘겨주자~
서버와 클라이언트 누구든 가능.
3-way-handshaking은 클라이언트로 부터 시작
disconnection은 서버, 클라이언트 둘 다 사용가능한데 보편적으로 클라이언트가 진행함.
클라이언트에서 서버로 FIN신호를 통해 연결을 끊고 서버는 ACK를 보낸다.
close() 함수 사용
좀비패킷 => TTL(10번을 Forwarding되도 해당 ip를 못 찾을 경우 없어진다)


source routing 패킷 => db os 패킷이야~라는 뜻이다.
blocking 함수: 농구에서 막는 것.
어디에서 대기하는 것.
어떠한 조건이 맞춰질 때까지 그곳에서 멈춰있는 것(머물러 있음)
non-blocking 함수: 머물러 있지 않음
scanf는 blocking함수(화면에서 입력할때까지 멈춰있음)
prinf는 non-blocking함수
blocking APIs
연결이 되려면 서버가 열려있어야 해서 connect은 아님!
debug할때 accept, read는 조건이 만족되지 않으면 머물려 있음.
non blocking APIs
나머지 다~
man 페이지로 socket 뿐만 아니라 나머지 함수들을 살펴볼 예정.
코딩을 하겠다!