일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- SSL
- MSYS2
- MYSQL
- apple
- openssl
- albumbook
- Nodejs
- Xcode
- 인증
- 앨범북
- 애플
- git
- kmip
- 앱리소스
- fido
- SWIFT
- otpkey
- SSH
- Android
- css
- MFA
- WebAuthn
- 앱스토어
- OTP
- 2FA
- OSX
- 안드로이드
- appres
- SwiftUI
- FIDO2
Archives
- Today
- Total
인디노트
ethertnet 패킷 라우팅 C 코드 본문
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <linux/if_packet.h>
#include <netinet/ether.h>
#define BUF_SIZE 2048
#define ETH_HDR_LEN 14
int main(int argc, char **argv) {
int sockfd;
struct ifreq ifr;
char buffer[BUF_SIZE];
struct ether_header *eth_header = (struct ether_header *) buffer;
struct sockaddr_ll socket_address;
int numbytes;
if(argc != 3) {
printf("Usage: %s <interface> <destination MAC address>\n", argv[0]);
exit(1);
}
sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if(sockfd < 0) {
perror("socket");
exit(1);
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
if(ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) {
perror("ioctl");
exit(1);
}
memset(&socket_address, 0, sizeof(socket_address));
socket_address.sll_family = AF_PACKET;
socket_address.sll_ifindex = ifr.ifr_ifindex;
socket_address.sll_halen = ETH_ALEN;
memcpy(socket_address.sll_addr, argv[2], ETH_ALEN);
while(1) {
numbytes = recvfrom(sockfd, buffer, BUF_SIZE, 0, NULL, NULL);
if(numbytes <= 0) {
perror("recvfrom");
continue;
}
if(memcmp(eth_header->ether_dhost, argv[2], ETH_ALEN) == 0) {
printf("Packet received on interface %s, forwarding...\n", argv[1]);
sendto(sockfd, buffer, numbytes, 0, (struct sockaddr *)&socket_address, sizeof(socket_address));
}
}
close(sockfd);
return 0;
}
위 코드는 지정된 인터페이스에서 수신한 이더넷 패킷의 목적지 MAC 주소를 확인하여, 목적지 주소가 지정한 MAC 주소와 일치하면 해당 패킷을 해당 MAC 주소를 가진 인터페이스로 전달하는 간단한 패킷 라우팅 코드입니다.
코드의 주요 기능은 다음과 같습니다.
- 소켓 생성 및 초기화
- 지정된 인터페이스의 인덱스 확인
- 패킷 수신 및 목적지 MAC 주소 확인
- 목적지 주소가 지정한 MAC 주소와 일치하면 해당 패킷을 해당 MAC 주소를 가진 인터페이스로 전달
참고로, 위 코드는 간단한 예시일 뿐이며 실제로는 이더넷 패킷 라우팅에 필요한 다양한 기능
반응형
'개발 플랫폼 및 언어 > 네트워크 기술' 카테고리의 다른 글
iphdr 의 송신자주소 및 수신자 주소를 변경하는 C 함수 (0) | 2023.04.14 |
---|---|
iphdr 의 check 계산 하는 C 코드 (0) | 2023.04.14 |
Multicast Packet 로부터 상대방 IP 알아내는 C 코드 (0) | 2023.04.14 |
PF_PACKET을 사용하여 C 코드에서 패킷을 보내는 예시 (0) | 2023.04.14 |
eth0 에서 recvfrom 함수로 읽어서 그대로 eth1 으로 write 함수로 전송 하는 C 코드 (0) | 2023.04.13 |
Comments