Web, Network Programming/Socket 8

TCP, UDP의 특징 비교

TCP와 UDP는 OSI 7계층 중 전송계층의 프로토콜로 포트를 사용한 두 종단 호스트 간의 데이터 전달을 담당합니다. TCP TCP(Transmission Control Protocol)는 두 종단간의 연결을 설정한 후에 데이터를 8비트 바이트 스트림으로 교환하는 연결형 프로토콜 입니다. TCP와 IP의 도메인을 비교하면, - IP : 호스트 대 호스트, 컴퓨터 레벨간의 통신이며 목적지 호스트에게만 메시지를 전달할 수 있습니다. - TCP : 응용 프로그램(프로세스)간에 메시지를 전달하며 포트 번호를 이용합니다. TCP의 연결 설정 및 해제 TCP는 송신측과 수신측이 서로 연결 설정을 위해 3단계로 신호를 교환합니다. 1. 송신측이 수신측에 SYN 세그먼트를 보내 연결 설정을 요청한다. 2. 수신측이 ..

멀티 스레드 TCP 서버/클라이언트

하나의 서버에 두개 이상의 클라이언트가 접속될 경우 교착상태에 빠진다. 이를 멀티스레드로 해결해본다. (해결방법은 여러가지) 어제 TCP 서버/클라이언트를 만들었는데, 거기서 스레드를 추가하는 거다. #include #include #include #define BUFSIZE 512 DWORD WINAPI ProcessClient(LPVOID arg) { SOCKET client_sock = (SOCKET)arg; char buf[BUFSIZE+1]; SOCKADDR_IN clientaddr; int addrlen; int retval; addrlen = sizeof(clientaddr); getpeername(client_sock, (SOCKADDR*)&clientaddr, &addrlen); // 클..

TCP 서버/클라이언트

TCP 프로토콜을 이용한 간단한 서버/클라이언트 애플리케이션을 만들어보자 서버, 클라이언트의 동작방식, 필요한 함수의 사용방법, 네트워크 연결과정, 패킷의 흐름까지 공부할 수 있겠다 우선 결과를 먼저 보고 코드를 아래쓰겠다 TCP 서버와, TCP 클라이언트의 모습 상단 : 서버 하단 : 클라이언트 클라이언트는 VMWARE로 돌린거 당연히 서버로 접속을 시도하고 입력한 문자를 서버로 전송하는 프로그램, 클라이언트가 메시지를 전송하고 서버는 메시지를 받는다. 이걸 도식화하면 서버가 먼저 실행되어 (메인모듈) 클라이언트가 접속되기를 기다린다. 잘 들어봐 Listen() 클라이언트가 서버에 접속하고 서버로 데이터를 보낸다 send() 서버는 클라이언트 접속을 허용 accept() 하고 클라이언트가 보낸 메시지를..

도메인 네임 서버

도메인네임서버 (Domain Name Server) 뭐,, 서버라고도하고 시스템이라고도하는데, 뭐가 맞는건지 아니면 서로 다른 용어인지는 잘 모르겠으나 어쨋든 알고있겠지만, www.naver.com 이런 도메인에서 실제 아이피를 얻어내는 작업이다. 지금 할거는 도메인 서버를 통한 아이피 얻어내기(도메인 -> ip) 해보자 1. DNS - IP주소와 대응되는 이름으로 사람이 기억해서 사용자가 쉽게 하려고 만든거다, TCP/IP 프로토콜은 도메인 이름을 인식하지 못하므로, 사용자가 입력한 도메인을 IP주소로 바꾸어주어야 한다. 2. gethostbyaddr - 구조 : struct HOSTENT FAR * gethostbyaddr { const char FAR * addr; int len; int type;..

바이트 정렬

바이트 정렬 방식에 대해서 알아보자잉 1. 바이트 정렬 - 바이트 정렬이란 메모리에 데이터를 저장할 때 바이트 순서를 나타내는 것으로, 빅엔디안, 리틀엔디안 알쥬? 빅엔디안 : 최상위 바이트부터 차례로 저장되는 방식 리틀엔디안 : 최하위 바이트부터 차례로 저장되는 방식 그래서, 바이트 정렬 방식이 틀릴 경우 잘못된 데이터가 전달될 가능성이 있다, 이러한 모호함을 없애기 위해서 ip주소와 포트번호의 바이트 정렬 방식은 빅엔디안으로 통일되어있다. 그런데, 인텔 프로세스에서는 바이트 정렬을 리틀엔디안 방식으로 하고있어서 ip주소와 포트번호를 정렬하는 방식과 맞지 않다, 따라서 빅엔디안을 네트워크 바이트 정렬이라고하고 시스템이 사용하는 정렬 방식을 호스트 바이트 정렬이라 한다. 2, 바이트 정렬 함수 - 그래서..

Socket 생성

소켓을 만들어보자 1. 소켓 생성 - 소켓을 이용하여 통신을 하기 위한 요건은 양단이 같은 프로토콜을 사용하는 것이다. socket() 함수는 사용자가 요청한 프로토콜을 이용하여 통신을 할 수 있도록 내부적으로 리소스를 할당하고 이를 접근할 수 있는 일종의 핸들값을 리턴한다. 이 값을 소켓 디스크립터라고 부르며, 각종 소켓 함수를 호출 할 때 인자로 전달하여 사용한다. 2. socket() - 구조 SOCKET socket ( int af, int type, int protocol ) : af 주소 체계 결졍. (Address Family) : type 소켓의 타입 결정 - 성공할 경우 0리턴, 아니면 에러코드 리턴 - 타입 : SOCK_STREAM - TCP, 신뢰성 있고 연결지향적, 대신 느려 SOC..

WS2_32.DLL

1. 소켓이란? - 소켓은 원래 유닉스에서 사용한 네트워크 프로그래밍 인터페이스 인데 요고를 윈도우에서 사용 가능하게 만들어준 것을 윈도우 소켓이라구 부른다, 윈도우 95버전부터 API에 정식으로 포함하여 제공하고있다. 2. 소켓의 특징. - 윈도우 소켓은 유닉스 소켓을 기반으로 한 네트워크 프로그래밍 인터페이스이므로, 소스코드수준에서 비교적 호환성이 높다잉, 그런데 아무래도 그 뿌리가 유닉스다보니까 다른 부분도 존재한다. * 윈도우 소켓은 DLL을 통해 대부분의 기능이 제공되므로 DLL 초기화와 종료작업을 위한 함수가 필요하다. * 윈도우 애플리케이션은 대게 그래픽 사용자 인터페이스를 기반으로하여 메시지 구동 방식으로 동작하므로 이를 위한 확장함수가 필요하다. * 윈도우는 운영체제 차원에서 멀티스레드를..

initSocketLayer

소스를 분석하는 중 InitSocketLayer 메서드를 만났다 아무래도 소켓 초기화를 해주는 것 같다 기본적으로 헤더는 라이브러리는 ws2_32.lib int InitSocketLayer() { int retval = 0 ; // Initialize the winsock environment WORD ver_request = MAKEWORD( 2, 2 ); WSADATA wsa_data; // Initialize the winsock environment. if ( WSAStartup( ver_request, &wsa_data ) ) { // Failed to startup WinSock return -1; } // Confirm the winsock environment supports at leas..