raw_sock.c
来自「Adhoc无线网络路由协议源码」· C语言 代码 · 共 67 行
C
67 行
#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 + =
减小字号Ctrl + -
显示快捷键?