ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LANShare 파일 전송 프로토콜 구축
    토이프로젝트/LANShare 2023. 1. 23. 22:41

    LANShare 파일 전송 프로토콜 구축 내용

     

    의미 있는 파일이 생성되는 순서는 다음과 같다.

    1. 빈 파일을 생성한다.
    2. 파일에 데이터를 추가한다.

    파일이 의미있는 파일이 되기 위해서는 위와 같은 과정을 거쳐야한다.

    CreateFile을 통해 저장될 파일을 생성한다. (이때 CreateFile이 호출이 된 시점에서의 파일 크기는 0바이트 이다.)

    이후, WriteFile을 사용하여, 이전에 생성된 파일에 데이터를 추가한다.

    모든 데이터를 추가한 경우 비로소 유효한 파일이 된다.

     

    서버와 클라이언트의 관점에서 보면 다음과 같다.

    서버는 P2P에 접속된 클라이언트에게 파일생성하라는 명령을 보낸다.

    이때, 클라이언트는 데이터를 받았을 때, 이 데이터가 어떤 데이터 인지는 모른다.

    그러므로, 미리 정의된 프로토콜을 기반으로 전송된 데이터(패킷)이 어떤 데이터인지 확인한다.

     

    서버쪽 통신 코드

    데이터가 담길 구조체 정의

    typedef struct PACKET_CreateFile
    {
    	int cmd;
    	char pkt[MAX_PATH]; // 260
    };

    해당 구조체에 데이터를 추가하고(명령어 정보 및 저장될 파일명) 전송한다.

    	PACKET_CreateFile packet;
    	GetMakeFilePacket(dst, packet);
    	for (int i = 0; i < sockets.size(); ++i)
    	{
    		const char* buf = (char*)&packet.cmd;
    		send(sockets[i].first, buf, sizeof(packet), 0);
    	}

     

    클라이언트 통신 코드

        while (true) {
            unsigned char buffer[1024] = { 0, }; // 수신한 패킷이 저장될 메모리 버퍼
            const int length = recv(client, (char*)buffer, 1024, 0); // 수신
            
            if (length > 0)  // 데이터가 유효하다면
            {
                int * cmd = (int *)buffer; // 버퍼에서 앞에 4개를 먼저 본다.
                switch (*cmd)
                {
                    case 1:
                    {
                        printf("CreateFile [%s]", &buffer[4]);
                    }
                    break;
                }
            }
            
        }

     

    위에 까지는 전체적인 데이터 전송에 대한 배경이였지만,

    아래 그림은 실제로 데이터가 전송되는 내용을 그림으로 표현한다.

    아래 >>>> 는 보내는 방향을 의미하고,

    파일 생성해! 라는 명령은 앞에 4바이트로 알아낸다.

    이후에, 어떤 파일을 ? 에 대한 답은 패킷의 5번째 바이트에서 부터 정의된다.

    사실 총 264개의 블럭이 있고, 앞에 4개 블럭은 명령어, 뒤에 260개의 블럭은 유효한 정보이다.

     

    위에 정보를 기반으로 실제로 패킷 프로토콜을 소프트웨어로 구현한 내용

     

    댓글

Designed by Tistory.