Socket통신/Socket통신
-
데이터 처리 방법Socket통신/Socket통신 2022. 4. 10. 15:47
TCP 프로토콜 기반의 서버와 클라이언트의 구현 시 주의할 점은 TCP는 ‘데이터의 경계가 없다’는 것이다. 데이터의 경계가 없다는 것은 공유 자원인 네트워크가 혼잡하여 TCP 송신 버퍼의 데이터가 보내지지 않고 있을 때 애플리케이션 데이터를 반복하여 TCP 송신 버퍼에 내려 보내면 TCP 송신 버퍼에서 상대편 수신 버퍼로 송신 버퍼의 데이터를 한 번에 보내거나 TCP 수신 버퍼에 도착한 데이터를 애플리케이션 버퍼로 늦게 가져오는 경우 상대편에서 보낸 데이터가 한 번에 복사되어 올라올 수 있는 등의 상황이 발생할 수 있다는 것이다. 그래서 TCP 프로토콜 기반의 송,수신 데이터를 설계할 때는 위 사항을 고려하여 설계해야 한다. 네트워크가 혼잡하여 애플리케이션에서 send()가 두 번 이루어진 후 TCP ..
-
다중 접속 1대 다 통신 서버 / 클라이언트Socket통신/Socket통신 2022. 4. 10. 15:08
저번 시간에 작성한 다중 접속 코드는 여러 클라이언트 들이 접속이 허용이 되어도 recv() send() 는 개별적으로 통신하는 구조였다. 다중 접속 1대 다 통신 구조에서는 하나의 클라이언트가 데이터를 보내면 다른 클라이언트들도 데이터를 받을 수 있어야 한다. 고민 해야 할것 하나의 스레드에서 어떻게 접속한 모든 클라이언트에게 전송 할 수 있을까? 모든 클라이언트는 send()를 호출 해야지만 recv를 받을수 있다. 해결 1. 서버는 모든 클라이언트에게 데이터를 전송 해주기 위해서는 모든 클라이언트의 주소를 알고 있어야 한다. 서버는 소켓들을 관리할 필요가 있다. accept() 시 통신 소켓 리스트에 소켓을 저장해주고 스레드 종료시 삭제 처리 2. 클라이언트 측에서는 recv()부분을 쓰레드를 생성..
-
쓰레드를 이용한 다중 에코 서버Socket통신/Socket통신 2022. 4. 10. 14:35
기존 작성한 에코 서버에서는 하나의 클라이언트가 접속이 되면 다른 클라이언트는 접속을 하지 못하는 구조 였다. 여러 클라이언트들이 접속을 하여도 문제 없는 서버를 만들기 위해서 흐름을 조금 바꿔보자! 먼저 기존의 코드에서 recv() send()의 부분을 쓰레드를 생성하여 넘겨주고, accept() 클라이언트 연결을 기다리는 부분도 무한 루프를 돌려주어 여러 클라이언트의 접속연결을 해줄 것이다. 서버는 여러 클라이언트의 접속을 대기하는 대기 쓰레드와 각각의 클라이언트와 통신을 담당하는 통신 쓰레드로 나뉜다. 기존 코드에서 바뀐 부분 1. 클라이언트 접속 대기 후 연결이 이루어지면 2. 접속한 클라이언트의 정보를 출력후 3. workThread (쓰레드 생성후 작업을 넘김) 4. 새로운 클라이언트를 대기 ..
-
TCP를 이용한 에코 프로그램 만들기Socket통신/Socket통신 2022. 4. 9. 18:18
전에 만든 기본 서버 코드를 이용할 것이다. 추가된 부분 서버측 1. 클라이언트의 접속을 accept() 대기후 접속이 이루어지면 2. 클라이언트의 접속 정보를 출력 3. 클라이언트 쪽 데이터 수신 정보를 recv()함수로 받고 4. send() 받은 정보를 다시 클라로 송신 5. 연결 종료 후 새로운 클라이언트의 접속대기 추가된 부분 클라이언트 1. 서버의 접속 성공시 2. 보낼 데이터를 입력받고 3. send() 서버측으로 전송 3. 에코로 서버측에서 돌아온 데이터를 출력후 4. 종료 결과 위 프로그램은 클라이언트와 서버의 대화가 연속적으로 이루어지지는 않는다. 연속적인 대화가 가능한 프로그램으로 수정 하기 위해서 recv와 send 부분을 무한루프로 묶을 것이다. 서버의 무한루프가 종료 되는 조건은..
-
TCP 서버 / 클라이언트 기본코드Socket통신/Socket통신 2022. 4. 9. 17:57
소켓 : 네트워크를 사용하기 위한 기본적인 인터페이스 역할 소켓을 예를 들어 핸드폰이라고 가정 해보자! 서버 측 1. 핸드폰을 구매한다 ( socket() ) 2. 핸드폰 번호를 받는다 (주소할당) 3. 핸드폰 주소를 연결 ( listen() ) 4. 수신 대기 ( accept() ) ->전화가 올때까지 대기 하고 있다가 연결이 되면 통신 소켓 생성 클라이언트 1. 핸드폰을 구매 ( socket() ) 2. 전화하기 ( connect() ) 서버측 코드 1. 윈도우 소켓 초기화 2.소켓을 생성하고 주소를 할당하고 연결시키는 과정 3. 생성된 listen소켓을 통해 클라이언트의 접속을 대기하는 구간 4. 클라이언트의 접속이 성공시 클라이언트의 정보를 출력! 클라이언트 코드 1. 윈도우 소켓 초기화 2. 소..
-
TCP 소켓 서버/클라이언트 프로그램 흐름과 구조Socket통신/Socket통신 2022. 4. 9. 13:44
TCP 서버는 크게 두 소켓의 흐름으로 구성된다. 하나는 대기 소켓의 흐름이며 하나는 통신 소켓의 흐름이다. 대기 소켓 : 클라이언트의 접속을 대기하고 클라이언트 요청을 수락하며 통신 소켓을 생성하는 역할을 담당 통신 소켓 : 대기 소켓에 의해 자동으로 생성되며 클라이언트 소켓과 통신을 담당 TCP 클라이언트는 1. 소켓을 생성하고 서버에 접속을 요청하여 2. 요청이 받아들여지면 자동으로 통신할 수 있는 소켓으로 변화하며 이 소켓을 사용하여 서버와 통신한다. 다음은 서버와 클라이언트가 통신하는 흐름을 표현한 그림이다. socket() 함수 소켓 프로그램에서 가장 먼저 해야 할 일은 소켓을 생성하는 것 소켓은 두 종단 시스템이 통신하기 위한 연결점이다. 윈도우 소켓은 통신에 사용되는 정보 집합이며 핸들을 ..
-
소켓 구조체Socket통신/Socket통신 2022. 4. 9. 13:27
소켓을 사용하기 위해 필수적으로 사용되는 sockaddr 구조체와 sockaddr_in 구조체를 공부하도록 하겠다. 다음은 sockaddr 구조체의 정의다. typedef struct sockaddr { u_short sa_family; // Address family. CHAR sa_data[14]; // Up to 14 bytes of direct address. } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR; sa_family는 2바이트 크기로 주소 체계를 지정한다. TCP , UDP 프로토콜은 AF_INET(PF_INET)을 사용하게 된다. sa_data[14]는 6바이트에 IP 주소와 포트 번호가 지정되며 나머지 8바이트는 예약되어 사용되지 않는다. 위 구조체는 프로그램..
-
IP 주소 변환 / 바이트 정렬Socket통신/Socket통신 2022. 4. 9. 13:18
네트워크 프로그램에서 IP 주소는 4바이트 정수(IPV4)로 사용되지만, 사람들은 IP 주소를 문자열로 확인하고 이해하는 것이 편하므로 서로간의 변환이 필요하다. inet_addr() inet_ntoa() 실행결과 inet_addr() : 문자열 형태의 IP 주소를 바이트 정렬된 4바이트 정수로 반환한다. inet_ntoa() : 함수는 4바이트 정수를 문자열 형태의 IP 주소로 반환한다. IN_ADDR 구조체는 다음과 같이 정의되어 IP 주소를 1바이트 형태나 2바이트 형태, 4바이트 형태의 정수로 사용하기 쉽도록 정의된 구조체다. typedef struct in_addr { union { struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { USHORT s..