BiteSnail / FileTransferWithMFC

File and Chatting message transfer program with MFC
MIT License
0 stars 1 forks source link

Network Interface Layer #6

Closed BiteSnail closed 2 years ago

BiteSnail commented 2 years ago

목적

사용자의 pc로부터 NETWORK ADAPTER 및 MAC ADDRESS 확인
송수신 쓰레드 구현

프로토타입 헤더

class CNILayer : public CBaseLayer{ //Thread 구현 
     pcap_if_t* alldevs; //all information of 
     int inum; //adapter index
public:
     CNILayer(char* pName) //생성 시에 pcap_findalldevs로 adapter 정보 저장
     ~CNILayer() //소멸자
     BOOL Receive() //Packet을 받아서 상위 layer(여기에서는 ethernet layer)로 전달한다. little endian, big endian 변환이 필요?
     BOOL Send(unsigned char* ppayload, int nlength); // little endian, big endian 변환이 필요?
     pcap_if_t* GetMacAddressList(); //alldevs를 return
     BOOL SetAdapter(const int index); //set inum, return value is success or fail
protected:
    NETWORK_INTERFACE_HEADER        m_sHeader;
}
BiteSnail commented 2 years ago

49e5c4d94378a08e5d720ab11340e5634789ed58 위 커밋에서 프로토타입 헤더 일부를 수정했습니다.

#pragma once
//NetworkInterfaceLayer.h: interface for the CNetworkInterfaceLayer class.

#if !defined(AFX_NETWORKINTERFACELAYER_H)
#define AFX_NETWORKINTERFACELAYER_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "BaseLayer.h"
#include "pch.h"
#include <pcap.h>
#include <tchar.h>
#include <Packet32.h>
#include <WinSock2.h>
#pragma comment(lib, "packet.lib")
#pragma comment(lib, "ws2_32.lib")

class CNILayer : public CBaseLayer { //Thread 구현 
    pcap_if_t* alldevs; //all information of 
    pcap_if_t* selected; //adapter index
    pcap_t* fp;
    char errbuf[PCAP_ERRBUF_SIZE];
    unsigned char packet[1500];
    bpf_u_int32 net, mask;
    struct in_addr net_addr, mask_addr;
    LPADAPTER adapter = NULL;
    PPACKET_OID_DATA OidData;
public:
    CNILayer(char* pName); //생성 시에 pcap_findalldevs로 adapter 정보 저장
    ~CNILayer(); //소멸자
    BOOL Receive(); //Packet을 받아서 상위 layer(여기에서는 ethernet layer)로 전달한다. little endian, big endian 변환이 필요?
    BOOL Send(unsigned char* ppayload, int nlength); // little endian, big endian 변환이 필요?
    void GetMacAddressList(CStringArray& adapterlist); //alldevs를 return
    UCHAR* SetAdapter(const int index); //set inum, return value is MAC ADDRESS
};

#endif // !defined(AFX_NETWORKINTERFACELAYER_H)

Dlg에서 combo_box를 구현할 때에 GetMacAddressList를 통해 모든 어뎁터의 description을 받아올 수 있습니다.
또한 어뎁터를 선택할 시에 SetAdapter(index)를 통해 unsigned char * 형태의 Mac addess를 받아올 수 있습니다.
구현에 참고하여 주시면 감사하겠습니다.

BiteSnail commented 2 years ago

9 으로 해당 기능 구현 종료합니다.