⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bnproxy.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		else		    if ((ssd = psock_socket(PSOCK_PF_INET,PSOCK_SOCK_STREAM,PSOCK_IPPROTO_TCP))<0)		    {			eventlog(eventlog_level_error,__FUNCTION__,"[%d] could create TCP socket (closing connection) (psock_socket: %s)",asock,pstrerror(psock_errno()));			psock_close(asock);		    }		    else			if (psock_ctl(ssd,PSOCK_NONBLOCK)<0)			{			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] could not set TCP socket to non-blocking mode (closing connection) (psock_ctl: %s)",asock,pstrerror(psock_errno()));			    psock_close(ssd);			    psock_close(asock);			}			else			    if (!(vc = virtconn_create(asock,ssd,ntohl(caddr.sin_addr.s_addr),BNETD_MIN_TEST_PORT)))			    {				eventlog(eventlog_level_error,__FUNCTION__,"[%d] unable to create new connection (closing connection)",asock);				psock_close(ssd);				psock_close(asock);			    }			    else			    {				memset(&caddr,0,sizeof(caddr));				caddr.sin_family = PSOCK_AF_INET;				caddr.sin_port = htons(virtconn_get_udpport(vc));				caddr.sin_addr.s_addr = htonl(virtconn_get_udpaddr(vc));				eventlog(eventlog_level_info,__FUNCTION__,"[%d] addr now %s:%hu",asock,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));			    }	    }	}		eventlog(eventlog_level_debug,__FUNCTION__,"checking for incoming UDP");	if (PSOCK_FD_ISSET(udpsock,&rfds))	{	    t_packet *         upacket;	    struct sockaddr_in toaddr;	    struct sockaddr_in fromaddr;	    psock_t_socklen    fromlen;	    int                len;	    	    if (!(upacket = packet_create(packet_class_raw)))		eventlog(eventlog_level_error,__FUNCTION__,"could not allocate raw packet for input");	    else	    {		/* packet_set_flags(upacket,PROXY_FLAG_UDP);*/				fromlen = sizeof(fromaddr);		if ((len = psock_recvfrom(udpsock,packet_get_raw_data_build(upacket,0),MAX_PACKET_SIZE,0,(struct sockaddr *)&fromaddr,&fromlen))<0)		{		    if (psock_errno()!=PSOCK_EINTR && psock_errno()!=PSOCK_EAGAIN && psock_errno()!=PSOCK_EWOULDBLOCK)			eventlog(eventlog_level_error,__FUNCTION__,"could not recv UDP datagram (psock_recvfrom: %s)",pstrerror(psock_errno()));		}		else		{		    if (fromaddr.sin_family!=PSOCK_AF_INET)			eventlog(eventlog_level_error,__FUNCTION__,"got UDP datagram with bad address family %d",fromaddr.sin_family);		    else		    {			char tempa[32];			char tempb[32];						packet_set_size(upacket,len);						if (fromaddr.sin_addr.s_addr==servaddr.sin_addr.s_addr) /* from server */			{			    if ((curr = list_get_first_const(virtconnlist()))) /* hack.. find proper client */			    {				vc = elem_get_data(curr);				memset(&toaddr,0,sizeof(toaddr));				toaddr.sin_family = PSOCK_AF_INET;				toaddr.sin_port = htons(virtconn_get_udpport(vc));				toaddr.sin_addr.s_addr = htonl(virtconn_get_udpaddr(vc));				eventlog(eventlog_level_info,__FUNCTION__,"[%d] addr by UDP send is %s:%hu",virtconn_get_client_socket(vc),inet_ntoa(toaddr.sin_addr),ntohs(toaddr.sin_port));								if (hexstrm)				{				    strcpy(tempa,inet_ntoa(fromaddr.sin_addr));				    strcpy(tempb,inet_ntoa(toaddr.sin_addr));				    fprintf(hexstrm,"%d: srv prot=UDP from=%s:%hu to=%s:%hu length=%d\n",					    udpsock,					    tempa,					    ntohs(fromaddr.sin_port),					    tempb,					    ntohs(toaddr.sin_port),					    len);				    hexdump(hexstrm,packet_get_raw_data(upacket,0),len);				}								/*queue_push_packet(virtconn_get_clientout_queue(__));*/ /* where to queue ... */				for (;;) /* hack.. just block for now */				{				    if (psock_sendto(udpsock,packet_get_raw_data_const(upacket,0),len,0,					             (struct sockaddr *)&toaddr,(psock_t_socklen)sizeof(toaddr))<len)				    {					if (psock_errno()==PSOCK_EINTR || psock_errno()==PSOCK_EAGAIN || psock_errno()==PSOCK_EWOULDBLOCK)					    continue;					eventlog(eventlog_level_error,__FUNCTION__,"could not send UDP datagram to client (psock_sendto: %s)",pstrerror(psock_errno()));				    }				    break;				}			    }			}			else /* from client */			{			    if (hexstrm)			    {				strcpy(tempa,inet_ntoa(fromaddr.sin_addr));				strcpy(tempb,inet_ntoa(servaddr.sin_addr));								fprintf(hexstrm,"%d: clt prot=UDP from=%s:%hu to=%s:%hu length=%d\n",					udpsock,					tempa,					ntohs(fromaddr.sin_port),					tempb,					ntohs(servaddr.sin_port),					len);				hexdump(hexstrm,packet_get_raw_data(upacket,0),len);			    }			    /*queue_push_packet(virtconn_get_serverout_queue(vc));*/			    for (;;) /* hack.. just block for now */			    {				if (psock_sendto(udpsock,packet_get_raw_data_const(upacket,0),len,0,					         (struct sockaddr *)&servaddr,(psock_t_socklen)sizeof(servaddr))<len)				{				    if (psock_errno()==PSOCK_EINTR || psock_errno()==PSOCK_EAGAIN || psock_errno()==PSOCK_EWOULDBLOCK)					continue;				    eventlog(eventlog_level_error,__FUNCTION__,"could not send UDP datagram to server (psock_sendto: %s)",pstrerror(psock_errno()));				}				break;			    }			}		    }		}		packet_del_ref(upacket);	    }	}		/* search connections for sockets that need service */	eventlog(eventlog_level_debug,__FUNCTION__,"checking for sockets that need service");	LIST_TRAVERSE_CONST(virtconnlist(),curr)	{	    unsigned int currsize;	    t_packet *   packet;	    	    vc = elem_get_data(curr);	                csocket = virtconn_get_client_socket(vc);	    if (virtconn_get_state(vc)==virtconn_state_connected ||		virtconn_get_state(vc)==virtconn_state_connecting)		ssocket = virtconn_get_server_socket(vc);	    else		ssocket = -1;	    	    eventlog(eventlog_level_debug,__FUNCTION__,"checking %d for client readability",csocket);	    if (PSOCK_FD_ISSET(csocket,&rfds))	    {		if (virtconn_get_state(vc)==virtconn_state_initial)		{		    if (init_virtconn(vc,servaddr)<0)		    {			virtconn_destroy(vc);			continue;		    }		}		else		{		    currsize = virtconn_get_clientin_size(vc);		    		    if (!queue_get_length(virtconn_get_clientin_queue(vc)))		    {			switch (virtconn_get_class(vc))			{			case virtconn_class_bnet:			    if (!(packet = packet_create(packet_class_bnet)))			    {				eventlog(eventlog_level_error,__FUNCTION__,"could not allocate normal packet for input");				continue;			    }			    break;			case virtconn_class_file:			    if (!(packet = packet_create(packet_class_file)))			    {				eventlog(eventlog_level_error,__FUNCTION__,"could not allocate file packet for input");				continue;			    }			    break;			case virtconn_class_bot:			    if (!(packet = packet_create(packet_class_raw)))			    {				eventlog(eventlog_level_error,__FUNCTION__,"could not allocate raw packet for input");				continue;			    }			    packet_set_size(packet,1); /* start by only reading one char */			    break;			default:			    eventlog(eventlog_level_error,__FUNCTION__,"[%d] connection has bad type (closing connection)",virtconn_get_client_socket(vc));			    virtconn_destroy(vc);			    continue;			}			queue_push_packet(virtconn_get_clientin_queue(vc),packet);			packet_del_ref(packet);			if (!queue_get_length(virtconn_get_clientin_queue(vc)))			    continue; /* push failed */			currsize = 0;		    }		    		    packet = queue_peek_packet((t_queue const * const *)virtconn_get_clientin_queue(vc)); /* avoid warning */		    switch (net_recv_packet(csocket,packet,&currsize))		    {		    case -1:			virtconn_destroy(vc);			continue;					    case 0: /* still working on it */			virtconn_set_clientin_size(vc,currsize);			break;					    case 1: /* done reading */			if (virtconn_get_class(vc)==virtconn_class_bot &&			    currsize<MAX_PACKET_SIZE)			{			    char const * const temp=packet_get_raw_data_const(packet,0);			    			    if (temp[currsize-1]!='\r' && temp[currsize-1]!='\n')			    {				virtconn_set_clientin_size(vc,currsize);				packet_set_size(packet,currsize+1);			        break; /* no end of line, get another char */			    }			    /* got a complete line... fall through */			}						packet = queue_pull_packet(virtconn_get_clientin_queue(vc));						if (hexstrm)			{			    fprintf(hexstrm,"%d: cli class=%s[0x%04hx] type=%s[0x%04hx] length=%hu\n",				    csocket,				    packet_get_class_str(packet),packet_get_class(packet),				    packet_get_type_str(packet,packet_dir_from_client),packet_get_type(packet),				    packet_get_size(packet));			    hexdump(hexstrm,packet_get_raw_data_const(packet,0),packet_get_size(packet));			}						queue_push_packet(virtconn_get_serverout_queue(vc),packet);			packet_del_ref(packet);			virtconn_set_clientin_size(vc,0);		    }		}	    }	    	    eventlog(eventlog_level_debug,__FUNCTION__,"checking %d for server readability",ssocket);	    if (ssocket!=-1 && PSOCK_FD_ISSET(ssocket,&rfds))	    {		currsize = virtconn_get_serverin_size(vc);				if (!queue_get_length(virtconn_get_serverin_queue(vc)))		{		    switch (virtconn_get_class(vc))		    {		    case virtconn_class_bnet:			if (!(packet = packet_create(packet_class_bnet)))			{			    eventlog(eventlog_level_error,__FUNCTION__,"could not allocate normal packet for input");			    continue;			}			break;		    case virtconn_class_file:			{			    unsigned int fileleft;			    			    if ((fileleft = virtconn_get_fileleft(vc))>0)			    {				if (!(packet = packet_create(packet_class_raw)))				{				    eventlog(eventlog_level_error,__FUNCTION__,"could not allocate raw file packet for input");				    continue;				}				if (fileleft>MAX_PACKET_SIZE)				    packet_set_size(packet,MAX_PACKET_SIZE);				else				    packet_set_size(packet,fileleft);			    }			    else			    {				if (!(packet = packet_create(packet_class_file)))				{				    eventlog(eventlog_level_error,__FUNCTION__,"could not allocate file packet for input");				    continue;				}			    }			}			break;		    case virtconn_class_bot:			if (!(packet = packet_create(packet_class_raw)))			{			    eventlog(eventlog_level_error,__FUNCTION__,"could not allocate raw packet for input");			    continue;			}			packet_set_size(packet,MAX_PACKET_SIZE); /* read as much as possible */			break;		    default:			eventlog(eventlog_level_error,__FUNCTION__,"[%d] connection has bad type (closing connection)",virtconn_get_client_socket(vc));			virtconn_destroy(vc);			continue;		    }		    queue_push_packet(virtconn_get_serverin_queue(vc),packet);		    packet_del_ref(packet);		    if (!queue_get_length(virtconn_get_serverin_queue(vc)))			continue; /* push failed */		    currsize = 0;		}				packet = queue_peek_packet((t_queue const * const *)virtconn_get_serverin_queue(vc)); /* avoid warning */		switch (net_recv_packet(ssocket,packet,&currsize))		{		case -1:		    virtconn_destroy(vc);		    continue;		    		case 0: /* still working on it */		    virtconn_set_serverin_size(vc,currsize);		    if (virtconn_get_class(vc)!=virtconn_class_bot || currsize<1)			break;		    else			packet_set_size(packet,currsize);		    /* fallthough... we take what we can get with the bot data */		    		case 1: /* done reading */		    packet = queue_pull_packet(virtconn_get_serverin_queue(vc));		    if (virtconn_get_class(vc)==virtconn_class_file)		    {			unsigned int len=virtconn_get_fileleft(vc);						if (len)			    virtconn_set_fileleft(vc,len-currsize);			else if (packet_get_type(packet)==SERVER_FILE_REPLY &&				 packet_get_size(packet)>=sizeof(t_server_file_reply))			    virtconn_set_fileleft(vc,bn_int_get(packet->u.server_file_reply.filelen));		    }		    queue_push_packet(virtconn_get_clientout_queue(vc),packet);		    packet_del_ref(packet);		    virtconn_set_serverin_size(vc,0);		}	    }	    	    eventlog(eventlog_level_debug,__FUNCTION__,"checking %d for client writeability",csocket);	    if (PSOCK_FD_ISSET(csocket,&wfds))	    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -