20230428

이종훈·2023년 4월 28일
0

소켓
서버와 클라이언트
서버 : 하나의 컴퓨터
클라이언트 : 사용자 (컴퓨터)

소켓 구성 요소
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프로토콜을 직접 사용한다.

서버와 클라이언트는 각각 소켓 생성

소켓의 흐름(TCP)

1. socket(주소 영역 지정, 서비스 타입, 프로토콜 지정)

  • 소켓 생성
  • socket() 성공적으로 실행 되면 디스크립터 반환한다.

2. bind() => 주소를 부여한다.

ex) 127.0.0.1:7777

  • 생성된 소켓에 주소 부여

3. listen() => 127.0.0.1:7777 서버 open

  • 소켓 활성화

4. accept(소켓,주소,주소의 길이) => 클라이언트의 요청(connect)을 대기

  • 임의의 클라이언트의 연결 요구가 들어올 때까지 대기
  • 연결 요청이 들어오면 둘 사이에 연결이 설정되고 서버에 새로운 소켓이 생성
  • 이후 데이터 송수신은 새로 생성된 소켓 이용.

5. connect => 서버로 연결하기 위한

6. send() => 메시지 전송

  • 연결형 서비스를 제공하는 환경에서 데이터 전송

7. recv() => 메시지 받을 때

  • 연결형 서비스를 제공하는 환경에서 데이터 수신

8. close() / if문을 사용하거나 해서 조건부로 close 할 수 있다.

웹소켓

서버는 listen까지 잘 실행되면 소켓 활성화
서버는 accept를 통해서 클라이언트의 요청을 받음.새로운 소켓을 만들어서 1:1 연결 (서버와 클라이언트를) 이때의 소켓 정보를 서버에서 sck_list vector 모두 저장.
클라이언트는 connect를 통해서 내가 연결하고자 하는 서버에 연결 요청을 보냄. (서버에서 새로 만든 소켓을 통해, 나와 서버가 1:1 통신을 할 수 있는 상태가 됨)
send /recv 서로 통신
서버에 접속해 있는 모든 클라이언트에게 한명의 클라이언트가 보낸 메시지를 전송해야 함.
누군진 모르겠지만 특정 클라이언트가 메시지를 보내면, 서버는 서버에 연결되어 있는 모든 소켓 정보(sck_list)를 이용해 for문을 돌면서 모든 클라이언트에게 send를 하게 됨.

서버가 send 하는 순간

. accept를 하는 순간
. 서버측 콘솔창에서 채팅을 입력했을 때
. 나갔을 때
. 클라이언트가 보낸 메시지를 recv로 받았을 때. (중요)

클라이언트가 send 하는 순간

. 입장할 때 connect 하고 바로. 내 닉네임 서버에 알려주기 위해
. 채팅을 입력하는 순간.

채팅 프로그램 만들기

  1. 회원 가입
  • id, pw, name
  • id : 회원을 구분하는 유일한 식별자
  • id 중복처리
  1. 로그인 => user id, pw
  • id, pw 로그인
  1. 채팅 => db에 저장, 정규화도 해야한다
    3-1. 처음 로그인할때 db에 저장되어 있는 메시지 입장 시에 모두 불러오기
    -----------------------------------------번외-----------
  2. dm 구현
  3. 회원정보 수정
profile
개발새발

0개의 댓글