소켓
서버와 클라이언트
서버 : 하나의 컴퓨터
클라이언트 : 사용자 (컴퓨터)
소켓 구성 요소
IP주소, 포트번호, 프로토콜
127.0.0.1:3306 (내 컴퓨터의 3306번 포트)
사실은 :80이 기본으로 붙어 있음.
https://www.naver.com:80
연결지향 TCP 소켓
TCP/IP
데이터를 잘 받았는지 중간중간 확인함. 속도는 느리지만 안정성이 높다.
데이터가 유실되지 않아야 하는 경우 TCP소켓을 사용.
비연결지향 UDP 소켓
연결되지 않은 상태에서 내가 원하는 주소에 데이터를 보낼 수 있는 통신 방법
데이터를 보낸 후 확인작업이 없어서 데이터가 다 수신되었는지 확인 불가능
속도가 빠르지만 데이터가 소실될 수 있다
UDP헤더의 체크섬 필드를 통해 최소한의 오류만을 검출
동영상 스트리밍 서비스.
TCP서버
서버와 클라이언트 1대1로 연결
스트림전송 -> 전송 데이터의 크기가 무제한
패킷에 대한 응답으로 인한 시간지연 CPU 소모
스트리밍 서비스에 불리하다.
우리는 AF_INET 주소체계를 쓸 것이다.
소켓 서비스
SOCK_STREAM - 연결형 서비스를 의미 (TCP 프로토콜에 대응)
SOCK_DGRAM - 비연결형 서비스를 의미 (UDP 프로토콜에 대응)
SOCK_RAW - IP프로토콜을 직접 사용한다.
서버와 클라이언트는 각각 소켓 생성
ex) 127.0.0.1:7777
서버는 listen까지 잘 실행되면 소켓 활성화
서버는 accept를 통해서 클라이언트의 요청을 받음.새로운 소켓을 만들어서 1:1 연결 (서버와 클라이언트를) 이때의 소켓 정보를 서버에서 sck_list vector 모두 저장.
클라이언트는 connect를 통해서 내가 연결하고자 하는 서버에 연결 요청을 보냄. (서버에서 새로 만든 소켓을 통해, 나와 서버가 1:1 통신을 할 수 있는 상태가 됨)
send /recv 서로 통신
서버에 접속해 있는 모든 클라이언트에게 한명의 클라이언트가 보낸 메시지를 전송해야 함.
누군진 모르겠지만 특정 클라이언트가 메시지를 보내면, 서버는 서버에 연결되어 있는 모든 소켓 정보(sck_list)를 이용해 for문을 돌면서 모든 클라이언트에게 send를 하게 됨.
서버가 send 하는 순간
. accept를 하는 순간
. 서버측 콘솔창에서 채팅을 입력했을 때
. 나갔을 때
. 클라이언트가 보낸 메시지를 recv로 받았을 때. (중요)
클라이언트가 send 하는 순간
. 입장할 때 connect 하고 바로. 내 닉네임 서버에 알려주기 위해
. 채팅을 입력하는 순간.