2017-09-16 5 views
0

나는 리눅스와 소켓의 소켓 인터페이스를 가지고 최근에 같은 네트워크에있는 머신간에 TCP와 UDP 패킷을 보내고 있습니다. . 일반적으로 이것은 소켓 구조를 사용하여 수행되며, 데이터를 열고, 쓰고, 읽은 다음, 닫을 때 메소드를 닫는 방법이 있습니다.c/C++로 장치/dev/eth0 (또는 유사)에 데이터를 보내는 가장 낮은 수준의 방법은 무엇입니까

이 소켓 구조가 없으면 어떻게 할 수 있습니까? 내 말은, 만약이 구조체를 사용한다면,이 구조체는 전달한 데이터를 프로토콜 헤더와 함께 포장하고 네트워크를 통해 전송한다는 것입니다.

수동으로 프로토콜 패킷과 데이터 그램을 만드는 경우 cat file.txt > /dev/etho (또는 제 경우는 /dev/wlp5s0)과 비슷한 것을 사용할 수 있지만 네트워크의 다른 컴퓨터로 데이터를 보내기 위해 c/C++를 사용합니까?

+1

[원시 소켓] (https://en.wikipedia.org/wiki/Raw_socket) 또는 [사용자 공간 네트워킹] (https://www.google.com/search?q=user)을 참조하십시오. + 공간 + 네트워킹). –

+0

@SteffenUllrich 원시 소켓에 대해서는 이미 알고 있었지만 여전히 소켓을 사용하고 있습니까? 이 사용자 공간 네트워킹을 살펴볼 것입니다. –

+0

* "하지만 여전히 소켓을 사용합니다"* - 네, 여전히 읽기 및 쓰기가 가능한 파일 설명자입니다. 그러나 제안하는 것처럼'/ dev/eth0'에 접근한다는 것은 당신이 읽고 쓸 수있는 파일 기술자를 가지고 있음을 의미합니다. 이제는 모든 것을 처리 할 수있는 능력을 갖추고있을뿐만 아니라 다른 애플리케이션이 네트워크 카드를 직접 사용하는 것을 유추하는 것을 포함하여 모든 것을 처리해야합니다. 이것이 사용자 공간 네트워크가 본질적으로하는 일입니다. 하나의 프로세스 (그리고 오직 하나의 프로세스)가 완전한 제어 권한을 가진 커널 대신 네트워크 카드를 완전히 제어 할 수 있습니다. –

답변

1

할 수 있습니다 당신이 노력한다면 분명 될 수있는 이유, /dev/eth0 직접 열 수 없습니다 :

$ cat /dev/eth0 
cat: /dev/eth0: No such file or directory 

장치가 단순히 파일 시스템에 표시되지 않은 네트워크 등의 디스크와 시리얼과 같은 방식으로 다른 하드웨어 장치 (라인)가 있습니다.

주석에서 지적한 것처럼 할 수있는 것은 원시 소켓을 사용하는 것입니다. Raw 소켓을 사용하면 원하는대로 할 수 있습니다. 완전하게 형성된 패킷을 보내고 커널은 그대로 출력합니다 (TCP 체크섬 오프로드 비 내구성).

다른 방향, 즉 커널이 파일 설명자를 네트워크 장치처럼 취급하게하려면 tap/tun 인터페이스 /dev/net/tun을 사용할 수 있습니다. 이렇게하면 커널이 실제 이더넷 장치 인 것처럼 취급하는 인터페이스를 만들 수 있습니다.이 인터페이스는 "수신 된"것을 제어하고 커널은 자신이 보내는 것을 알게합니다.