/** * @brief ethdump socket init * * @return socket fd, if succ; -1, if failed. */ int raw_socket_init() { struct sockaddr_ll addrll = {0}; char ifname[20] = {0}; char *p = ifname; int fd = -1; /** * create raw socket used to recv all data from interface */ if ((fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("raw socket create"); return -1; } /** * get interface name */ get_ifname(p); /** * make interface working on hybrid mode */ //make_socket_promisc(ifname, fd, 1); /** * set recv buf size */ if (set_socket_recv_buf(fd, 5 * 1024) < 0) return -1; /** * socket addr init */ addrll.sll_family = PF_PACKET; addrll.sll_ifindex = 0; addrll.sll_protocol = htons(ETH_P_ALL); /** * socket bind used to recvfrom data */ if (bind(fd, (struct sockaddr *)&addrll, sizeof(addrll)) < 0) { perror("bing the interface"); close(fd); return -1; } return fd; }
int init_kernel(const char* ipaddr_,const unsigned short port_,const int udp_packet_filter_thread_num_) { #ifdef WIN32 if(InitWinsock2()==-1) { print_error("WSAStartup failed to Init Winsock2."); return -1; } #endif /* Initialize socket address structure for Interner Protocols */ _numberOfWorkerThreads = udp_packet_filter_thread_num_; _udp_port = port_; memset(&_internetAddr, 0,sizeof(_internetAddr)); // empty data structure _internetAddr.sin_family = AF_INET; if(ipaddr_==NULL) _internetAddr.sin_addr.s_addr = htonl(INADDR_ANY); else _internetAddr.sin_addr.s_addr=inet_addr(ipaddr_); _internetAddr.sin_port = htons(port_); _hSocket = socket(AF_INET, SOCK_DGRAM, 0); if( bind(_hSocket, ( struct sockaddr * )&_internetAddr, sizeof(_internetAddr ) ) == -1 ) { print_error("WSAStartup failed to bind sock."); close_socket(_hSocket); clean_up(); return -1; } set_socket_recv_buf(_hSocket,16*1024);//HDS_UDP_SOCKET_RECV_BUF_SIZE); set_socket_send_buf(_hSocket,HDS_UDP_SOCKET_SEND_BUF_SIZE); if(set_socket_reuse(_hSocket) == -1) { print_error("WSAStartup failed to reuse sock."); close_socket(_hSocket); clean_up(); return -1; } if(HDS_Thread_Create(UDPServerRecvThread,NULL,&_recvThreadData)==-1) { print_error("A recv thread was not able to be created"); close_socket(_hSocket); clean_up(); return -1; } _workerThreadDataArray = (HDS_Thread_Data*)malloc(_numberOfWorkerThreads*sizeof(HDS_Thread_Data)); memset(_workerThreadDataArray, 0, sizeof(HDS_Thread_Data) * _numberOfWorkerThreads); for(int i= 0; i < _numberOfWorkerThreads; ++i) { // We only create in the suspended state so our workerThreadHandles object // is updated before the thread runs. if(HDS_Thread_Create(UDPServerWorkerThread,NULL,&_workerThreadDataArray[i])==-1) { print_error("A worker thread was not able to be created"); close_socket(_hSocket); free(_workerThreadDataArray); clean_up(); return -1; } } return 0; }