static int QueryDNSListenUDP(void *ID){ socklen_t AddrLen; CompatibleAddr ClientAddr; int State; ThreadContext Context; char RequestEntity[1024]; InitContext(&Context, RequestEntity); /* Listen and accept requests */ while(TRUE) { memset(&ClientAddr, 0, sizeof(ClientAddr)); GET_MUTEX(ListenMutex); if( Family == AF_INET ) { AddrLen = sizeof(struct sockaddr); State = recvfrom(ListenSocketUDP, RequestEntity, sizeof(RequestEntity), 0, (struct sockaddr *)&(ClientAddr.Addr4), &AddrLen ); } else { AddrLen = sizeof(struct sockaddr_in6); State = recvfrom(ListenSocketUDP, RequestEntity, sizeof(RequestEntity), 0, (struct sockaddr *)&(ClientAddr.Addr6), &AddrLen ); } RELEASE_MUTEX(ListenMutex); if(State < 1) { if( ErrorMessages == TRUE ) { int ErrorNum = GET_LAST_ERROR(); char ErrorMessage[320]; ErrorMessage[0] ='\0'; GetErrorMsg(ErrorNum, ErrorMessage, sizeof(ErrorMessage)); if( Family == AF_INET ) { printf("An error occured while receiving from %s : %d : %s .\n", inet_ntoa(ClientAddr.Addr4.sin_addr), ErrorNum, ErrorMessage ); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(ClientAddr.Addr6.sin6_addr), Addr); printf("An error occured while receiving from %s : %d : %s .\n", Addr, ErrorNum, ErrorMessage ); } } continue; } Context.RequestLength = State; Query(&Context, &ClientAddr); ExtendableBuffer_Reset(Context.ResponseBuffer); } return 0; }
static int TCPRecv(RecvInfo *Info) { SOCKET Socket = Info -> Socket; CompatibleAddr Peer = Info -> Peer; int state; char ResultBuffer[1024]; ExtendableBuffer Buffer; /* Sockets to server */ SOCKET TCPSocket = INVALID_SOCKET; SOCKET UDPSocket = INVALID_SOCKET; SOCKET *PrimarySocketPtr; SOCKET *SecondarySocketPtr; DNSQuaryProtocol PrimaryProtocol; char ProtocolStr[8] = {0}; strncpy(ProtocolStr, ConfigGetString(&ConfigInfo, "PrimaryServer"), 3); StrToLower(ProtocolStr); if( strcmp(ProtocolStr, "tcp") == 0 ) { PrimaryProtocol = DNS_QUARY_PROTOCOL_TCP; PrimarySocketPtr = &TCPSocket; if( ConfigGetString(&ConfigInfo, "UDPServer") != NULL ) SecondarySocketPtr = &UDPSocket; else SecondarySocketPtr = NULL; } else { PrimaryProtocol = DNS_QUARY_PROTOCOL_UDP; PrimarySocketPtr = &UDPSocket; if( ConfigGetString(&ConfigInfo, "TCPServer") != NULL ) SecondarySocketPtr = &TCPSocket; else SecondarySocketPtr = NULL; } ExtendableBuffer_Init(&Buffer, 512, 10240); while(TRUE){ state = recv(Socket, ResultBuffer, sizeof(ResultBuffer), MSG_NOSIGNAL); if(GET_LAST_ERROR() == TCP_TIME_OUT) { break; } if( state < 1 ) { break; } Query(PrimarySocketPtr, SecondarySocketPtr, PrimaryProtocol, ResultBuffer, state, &Socket, &Peer, &Buffer); ExtendableBuffer_Reset(&Buffer); } CLOSE_SOCKET(TCPSocket); CLOSE_SOCKET(UDPSocket); CLOSE_SOCKET(Socket); if( Family == AF_INET ) { INFO("Closed TCP connection to %s:%d\n", inet_ntoa(Peer.Addr4.sin_addr), Peer.Addr4.sin_port); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(Peer.Addr6.sin6_addr), Addr); INFO("Closed TCP connection to %s:%d\n", Addr, Peer.Addr6.sin6_port); } SafeFree(Info); EXIT_THREAD(0); }