📄 raw_sock.c
字号:
#include "raw_sock.h"/* * rawsock_init(): * prepare the raw socket and return the handle (file descriptor) */int rawsock_init(){ char on = 1; int s, r; int onr = 1; /* raw socket */ if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { perror("socket(AF_INET, SOCK_RAW, IPPROTO_RAW)"); return -1; } r = setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); if (r < 0) { close (s); perror("setsockopt(IPPROTO_IP)"); return -1; } /* set SO_REUSEADDR so that more than one process can use the socket */ if(setsockopt(s,SOL_SOCKET, SO_REUSEADDR, &onr, sizeof(onr)) < 0) { perror("rawsock_init() : setsockopt"); return -1; } return (s);}/* * rawsock_out(fd, buf, len, flags): * write the packet from buf into fd, return bytes actually written */int rawsock_out(int s, unsigned char *buf, int len, int flags){ int r; struct sockaddr_in sin; sin.sin_family = AF_INET; memcpy(&sin.sin_addr.s_addr, buf+16, 4); /* buf+16: dest ip */ sin.sin_port = 0; r = sendto(s, (void *)buf, len, flags, (struct sockaddr *)&sin, sizeof(sin));#ifdef DEBUG { int i; fprintf(stderr, "OUT: (%d) [ ", len); for (i = 0; i < 20; i++) fprintf(stderr, "%02x ", buf[i]); fprintf(stderr, "] = %d\n", r); }#endif if (r < 0) perror("rawsock_out: sendto()"); return r;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -