Beispiel #1
0
/**
 * @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;
}
Beispiel #2
0
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;
}