일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 앱스토어
- OSX
- SWIFT
- apple
- albumbook
- SwiftUI
- FIDO2
- 인증
- 앱리소스
- fido
- SSL
- WebAuthn
- 앨범북
- css
- appres
- Nodejs
- kmip
- MFA
- git
- Android
- otpkey
- openssl
- MYSQL
- OTP
- MSYS2
- 안드로이드
- SSH
- Xcode
- 2FA
- 애플
- Today
- Total
목록개발 플랫폼 및 언어/네트워크 기술 (32)
인디노트
TCP 헤더의 Checksum 필드를 0으로 설정합니다. TCP 헤더와 TCP 데이터를 모두 합친 패킷을 16 비트 단위로 쪼개어 1의 보수를 취합니다. 쪼개진 16 비트 값들을 모두 더합니다. 더한 결과값이 16비트를 초과하면 초과한 값은 더하고, 아닌 경우에는 더하지 않습니다. 마지막으로 1의 보수를 취한 값이 TCP 헤더의 Checksum 필드 값이 됩니다. Pseudo-Header Checksum (RFC 793): [Src IP] + [Dst IP] + [0x00] + [Protocol] + [TCP Length] (16 bits) (16 bits) (8 bits) (8 bits) (16 bits) TCP Checksum: [TCP Header] + [TCP Payload] (16 bits) (..
#include // tcp 헤더 구조체 struct tcphdr { u_int16_t source; // 송신 포트 번호 u_int16_t dest; // 수신 포트 번호 u_int32_t seq; // 시퀀스 번호 u_int32_t ack_seq; // 확인 응답 번호 u_int16_t doff:4; // 데이터 오프셋 u_int16_t res1:4; // 예약 u_int16_t res2:2; // 예약 u_int16_t urg:1; // 긴급 플래그 u_int16_t ack:1; // 확인 응답 플래그 u_int16_t psh:1; // 전송 제어 플래그 u_int16_t rst:1; // 재설정 플래그 u_int16_t syn:1; // 연결 요청 플래그 u_int16_t fin:1; // 연결 ..
#include #include #include #include int main() { char ip_address_str[] = "192.168.0.1"; unsigned char ip_address[4]; // 문자열을 unsigned char 배열로 변환 if (inet_pton(AF_INET, ip_address_str, ip_address) != 1) { fprintf(stderr, "Failed to convert IP address\n"); return 1; } // 변환된 unsigned char 배열 출력 for (int i = 0; i < 4; i++) { printf("%d ", ip_address[i]); } printf("\n"); return 0; } 위 코드에서 inet_pto..
Linux에서 시그널 처리를 위해서는 signal() 함수를 사용하여 시그널 핸들러 함수를 등록해야 합니다. 시그널 핸들러 함수는 시그널이 발생했을 때 실행됩니다. 대기 상태에서 시그널이 발생하면, 시그널 핸들러 함수가 호출되어 해당 시그널에 대한 처리를 수행합니다. 그러면 대기 중인 함수가 깨어나서 시그널 핸들러 함수를 실행하고, 이후에 다시 대기 상태로 들어갑니다. #include #include #include #include void signal_handler(int signal_num) { printf("Received signal %d\n", signal_num); } int main() { signal(SIGUSR1, signal_handler); // SIGUSR1 시그널 핸들러 등록 wh..
#include #include #include #include #include #include #include #include #define PACKET_SIZE 4096 #define IP_HDR_SIZE sizeof(struct iphdr) #define ICMP_HDR_SIZE sizeof(struct icmphdr) // IP 체크섬 계산 함수 unsigned short checksum(void *b, int len) { unsigned short *buf = b; unsigned int sum = 0; unsigned short result; for (sum = 0; len > 1; len -= 2) sum += *buf++; if (len == 1) sum += *(unsigned char ..
#include #include #include #include // IP 헤더의 송신자 주소와 수신자 주소를 변경하는 함수 void change_ip_address(unsigned char *ip_packet, char *src_ip, char *dst_ip) { struct iphdr *ip_header = (struct iphdr*)ip_packet; // 송신자 주소와 수신자 주소를 변경함 ip_header->saddr = inet_addr(src_ip); ip_header->daddr = inet_addr(dst_ip); } int main() { unsigned char ip_packet[256] = {0x45, 0x00, 0x00, 0x3c, 0x1a, 0x2e, 0x40, 0x00, 0x4..
#include #include #include #include #include // IP 헤더의 체크섬 필드를 계산하는 함수 unsigned short calculate_ip_checksum(struct iphdr *ip_header) { unsigned int sum = 0; unsigned short checksum; // IP 헤더의 체크섬 필드는 0으로 초기화 ip_header->check = 0; // IP 헤더의 각 2바이트를 16비트 체크섬 값에 더함 for (int i = 0; i < sizeof(struct iphdr) / 2; i++) { sum += *((unsigned short*)ip_header + i); } // 체크섬 계산 결과에 carry를 전파하는 부분을 처리 while..
#include #include #include #include #include #include #include #include #include #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 \n", argv[0]); exit(1); } sockfd = s..
#include #include #include #include #include #include #include #include #include #define MAX_BUF_LEN 2048 int main(int argc, char *argv[]) { int sockfd, n; char buffer[MAX_BUF_LEN]; struct sockaddr_in servaddr, cliaddr; socklen_t len = sizeof(cliaddr); // 소켓 생성 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 소켓 옵션 설정 int reuse = 1; ..
#include #include #include #include #include #include #include #include int main() { int sock_fd; struct sockaddr_ll dest_addr; char buffer[ETH_FRAME_LEN]; unsigned char dest_mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // Broadcast address // Create a PF_PACKET socket sock_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock_fd < 0) { perror("socket"); return 1; } // Set the destinati..