Beispiel #1
0
template<class T, USHORT default_port> BOOL CHttpAgentT<T, default_port>::SendRequest(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength)
{
	THttpObj* pHttpObj = FindHttpObj(dwConnID);

	if(pHttpObj == nullptr)
	{
		::SetLastError(ERROR_OBJECT_NOT_FOUND);
		return FALSE;
	}
	
	WSABUF szBuffer[2];
	CStringA strHeader;

	LPCSTR lpszHost	= nullptr;
	USHORT usPort	= 0;
	BOOL bConnect	= (_stricmp(lpszMethod, HTTP_METHOD_CONNECT) == 0);

	if(!bConnect)
	{
		GetRemoteHost(dwConnID, &lpszHost, &usPort);
		if(usPort == default_port) usPort = 0;
	}

	CStringA strPath;
	::AdjustRequestPath(bConnect, lpszPath, strPath);

	pHttpObj->SetRequestPath(lpszMethod, strPath);
	pHttpObj->ReloadCookies();

	::MakeRequestLine(lpszMethod, strPath, m_enLocalVersion, strHeader);
	::MakeHeaderLines(lpHeaders, iHeaderCount, &pHttpObj->GetCookieMap(), iLength, TRUE, -1, lpszHost, usPort, strHeader);
	::MakeHttpPacket(strHeader, pBody, iLength, szBuffer);

	return SendPackets(dwConnID, szBuffer, 2);
}
    void AutomaticTest(int NumBuffers)
    {
        m_AutoamticTest = true;
        m_IncomingBuffersAccumulator.Advise(this);

        m_IncomingBuffersAccumulator.Clear();
        for (int i = 0; i < NumBuffers; ++i)
        {
            GenerateTestBuffer();
            SendPackets();
        }

        while(!m_TestMap.empty())
            SendPackets();

        Assert(m_IncomingBuffersAccumulator.IsEmpty());
        m_IncomingBuffersAccumulator.Clear();
    }
Beispiel #3
0
template<class T, USHORT default_port> BOOL CHttpAgentT<T, default_port>::SendWSMessage(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], BYTE* pData, int iLength, ULONGLONG ullBodyLen)
{
	WSABUF szBuffer[2];
	BYTE szHeader[HTTP_MAX_WS_HEADER_LEN];

	if(!::MakeWSPacket(bFinal, iReserved, iOperationCode, lpszMask, pData, iLength, ullBodyLen, szHeader, szBuffer))
		return FALSE;

	return SendPackets(dwConnID, szBuffer, 2);
}
Beispiel #4
0
BOOL CTcpClient::Send(const BYTE* pBuffer, int iLength, int iOffset)
{
	ASSERT(pBuffer && iLength > 0);

	if(iOffset != 0) pBuffer += iOffset;

	WSABUF buffer;
	buffer.len = iLength;
	buffer.buf = (char*)pBuffer;

	return SendPackets(&buffer, 1);
}
Beispiel #5
0
BOOL CTcpServer::Send(CONNID dwConnID, const BYTE* pBuffer, int iLength, int iOffset)
{
	ASSERT(pBuffer && iLength > 0);

	if(iOffset != 0) pBuffer += iOffset;

	WSABUF buffer;
	buffer.len = iLength;
	buffer.buf = (char*)pBuffer;

	return SendPackets(dwConnID, &buffer, 1);
}
Beispiel #6
0
void
CAR6KMini::car6k_sendEapolKeyMsg (A_UINT8 descType,
                            A_BOOL secure, A_BOOL mic, A_BOOL ack, A_BOOL tx,
                            A_UINT32 index, A_UINT8 isPW,
                            A_BOOL doEncrypt,
                            A_UINT64 keyRSC,
                            const A_UINT8 nonce[],
                            const A_UINT32 keyLength,
                            A_UINT32 keyDataLen,
                            const A_UINT8 *keyData,
                            const A_UINT32 keyBufferLength,
                            A_UINT8  *bssid)
{
    STATION *station;
    station = GetStation(bssid,0);
    NDIS_STATUS Status;
    PNDIS_PACKET pPacket;
    PNDIS_BUFFER pBuffer;
    A_UINT32 *magic;
    A_UINT16 length;

    memset (m_wpa_buffer, 0 , sizeof (m_wpa_buffer));
    crypto_sendEapolKeyMsg ( descType,secure, mic, ack,  tx,
                             index, isPW,doEncrypt,keyRSC,
                             nonce,keyLength,keyDataLen,
                             keyData, keyBufferLength,
                             bssid,m_CurrentAddress,m_keyCounter,&replayCtr,
                             station,m_wpa_buffer,&length);

    NdisAllocatePacket (&Status, &pPacket, m_TxPacketPool);
    magic = (UINT32 *) pPacket->ProtocolReserved;
    if (NDIS_STATUS_SUCCESS != Status)
    {
        NDIS_DEBUG_PRINTF (ATH_LOG_ERR, "AR6K: ERROR - NdisAllocatePacket failed\n");
        return;
    }

    NdisAllocateBuffer (&Status, &pBuffer, m_TxBufferPool, m_wpa_buffer, length);

    if (NDIS_STATUS_SUCCESS != Status)
    {
        NdisFreePacket (pPacket);
        NDIS_DEBUG_PRINTF (ATH_LOG_ERR, "AR6K: ERROR - NdisAllocateBuffer failed\n");
        return;
    }

    pBuffer->Next = NULL;
    NdisChainBufferAtFront (pPacket,pBuffer);
    *(magic) = TAG_WPA_SEND_PCK;
    SendPackets (&pPacket,1);
    return;
}
Beispiel #7
0
void Client::Logic()
{
  clock_t time = clock();
  clock_t actime = time;

  SOCKET bsock;

  SocketBase bcomm;
  sockaddr_in &bsin = bcomm.Connect( PORT_BROADCAST );
  bsock = bcomm.CreateSocket();
  bcomm.Bind();
  bcomm.SetBroadcast( true );

  int keysize = int( key.size() + 1 );
  int portsize = sizeof port;

  char *message = new char[ keysize + portsize ];

  //memcpy( message, this.key.c_str(), keysize );
  //memcpy( message + keysize, &this.port, portsize );

  while ( running )
  {
    LONGLONG flowend = Clock() - flowstart;
    if ( flowend >  1000000LL )
    {
      flowstart = Clock();
      currentdatasent = 0;
      float l = GetRTT();
      if ( l < 0.0001f )
        BandWidth += 512;
      else if ( l > 0.001f )
        BandWidth -= 512;
    }

    if ( !ServerFound )
    {
      FindServer( bsock, message, portsize, keysize );
    }

    SendPackets();

    ReceivePackets();

    HandlePackets();

    UpdateRTT();

    Sleep( 10 );
  }
}
Beispiel #8
0
BOOL CTcpServer::SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead, const LPWSABUF pTail)
{
	CAtlFile file;
	CAtlFileMapping<> fmap;
	WSABUF szBuf[3];

	HRESULT hr = ::MakeSmallFilePackage(lpszFileName, file, fmap, szBuf, pHead, pTail);

	if(FAILED(hr))
	{
		::SetLastError(HRESULT_CODE(hr));
		return FALSE;
	}

	return SendPackets(dwConnID, szBuf, 3);
}
Beispiel #9
0
void G2Node::OnPacketSent(const bs::error_code& err)
{
    if(closed_) return;

    if(!err)
    {
        packetBuf_.clear();
        dispatchQueue_.pop();
        if(!dispatchQueue_.empty()) SendPackets();
    }
    else if(err != ba::error::operation_aborted)
    {
        System::LogDev() << "G2Node::OnPacketSent " << myInfo_.endpoint.ToString() << " " << err.message() << std::endl;
        DetachMe();
    }
}
void CBaseServer::PostFrame()
{
	//SV_CheckVars();
	
	// Send messages back to the clients that had packets read this frame
	SendPackets();
	
	// save the entire world state if recording a serverdemo
	//SV_RecordDemoMessage();

	// send a heartbeat to the master if needed
	//Master_Heartbeat();

	// clear teleport flags, etc for next frame
	//SV_PrepWorldFrame();
};
Beispiel #11
0
BOOL CTcpClient::SendSmallFile(LPCTSTR lpszFileName, const LPWSABUF pHead, const LPWSABUF pTail)
{
	CFile file;
	CFileMapping fmap;
	WSABUF szBuf[3];

	HRESULT hr = ::MakeSmallFilePackage(lpszFileName, file, fmap, szBuf, pHead, pTail);

	if(FAILED(hr))
	{
		::SetLastError(hr);
		return FALSE;
	}

	return SendPackets(szBuf, 3);
}
Beispiel #12
0
BOOL CTcpAgent::SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead, const LPWSABUF pTail)
{
	ASSERT(lpszFileName != nullptr);

	CAtlFile file;
	HRESULT hr = file.Create(lpszFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING);

	if(SUCCEEDED(hr))
	{
		ULONGLONG ullLen;
		hr = file.GetSize(ullLen);

		if(SUCCEEDED(hr))
		{
			ULONGLONG ullTotal = ullLen + (pHead ? pHead->len : 0) + (pTail ? pTail->len : 0);

			if(ullLen > 0 && ullTotal <= MAX_SMALL_FILE_SIZE)
			{
				CAtlFileMapping<> fmap;
				hr = fmap.MapFile(file);

				if(SUCCEEDED(hr))
				{
					WSABUF bufs[3] = {0};

					bufs[1].len = (ULONG)ullLen;
					bufs[1].buf = fmap;

					if(pHead) memcpy(&bufs[0], pHead, sizeof(WSABUF));
					if(pTail) memcpy(&bufs[2], pTail, sizeof(WSABUF));

					return SendPackets(dwConnID, bufs, 3);
				}
			}
			else if(ullLen == 0)
				hr = HRESULT_FROM_WIN32(ERROR_FILE_INVALID);
			else
				hr = HRESULT_FROM_WIN32(ERROR_FILE_TOO_LARGE);
		}
	}

	::SetLastError(hr & 0x0000FFFF);

	return FALSE;
}
Beispiel #13
0
QTSS_Error  QTSSRTPFileModuleDispatch(QTSS_Role inRole, QTSS_RoleParamPtr inParamBlock)
{
    switch (inRole)
    {
        case QTSS_Register_Role:
            return Register(&inParamBlock->regParams);
        case QTSS_Initialize_Role:
            return Initialize(&inParamBlock->initParams);
        case QTSS_RereadPrefs_Role:
            return RereadPrefs();
        case QTSS_RTSPPreProcessor_Role:
            return ProcessRTSPRequest(&inParamBlock->rtspPreProcessorParams);
        case QTSS_RTPSendPackets_Role:
            return SendPackets(&inParamBlock->rtpSendPacketsParams);
        case QTSS_ClientSessionClosing_Role:
            return DestroySession(&inParamBlock->clientSessionClosingParams);
    }
    return QTSS_NoErr;
}
Beispiel #14
0
void CServer::Run ()
{
    while (m_bRun)
    {
        if (static_cast<int> (m_vpClients.size ()) > 1)
        {
            ReceivePackets ();
            if (m_Clock.getElapsedTime () >= sf::milliseconds (1000 / m_uiTickRate))
            {
                SendPackets ();
                m_Clock.restart ();
            }
        }
        else
            ListenOnIncomingConnections ();
        if (sf::Keyboard::isKeyPressed (sf::Keyboard::Escape))
            m_bRun = false;
        sf::sleep (sf::milliseconds (1));
    }
}
Beispiel #15
0
void G2Node::Send(const G2::Packet& packet)
{
    dispatchQueue_.push(packet);
    if(packetBuf_.empty())
        SendPackets();
}
Beispiel #16
0
// This is the main entry point in to the control code
// and will be run in it's own thread
void *ControlRun(void *pParam){

	struct sockaddr_in FromAddr;
	socklen_t SockaddrLen;
	struct timeval	NowTime;
	BYTE PacketBuffer[max(sizeof(MASTERPACKET), sizeof(CLIENTPACKET)) + 2];
	int PacketSize, i, j;
	//pthread_t idWriteStatsFileThread;

	// Clear stats
	memset(&ClientStats, 0, sizeof(ClientStats));
	
	// Open UDP connection to server
	memset(&MasterAddr, 0, sizeof(MasterAddr));
	MasterAddr.sin_family = AF_INET;
	MasterAddr.sin_addr.s_addr = inet_addr(Config.MasterIp);
	MasterAddr.sin_port = htons(Config.MasterPort);

	hControlPort = socket(PF_INET, SOCK_DGRAM, 0);
	if(hControlPort < 0){
		Log(LOG_ERR, "Failed to open client socket");
		return NULL;
	}

	// Bind it to a local port
	memset(&LocalAddr, 0, sizeof(LocalAddr));
	LocalAddr.sin_family = AF_INET;
	LocalAddr.sin_addr.s_addr = inet_addr("0.0.0.0");
	LocalAddr.sin_port = htons(0);

	if(bind(hControlPort, (struct sockaddr *)&LocalAddr, sizeof(LocalAddr)) != 0){
		close(hControlPort);
		Log(LOG_ERR, "Failed to bind to client port");
		return NULL;
	}

	// Get initial wireless data
	GetWirelessState();

	// Store intial background processing time
	gettimeofday(&LastCtrlBackgroundTime, NULL);
	LastCtrlBackgroundTime.tv_sec -= 8;

	// Set the initial status
	ClientStatus = CS_REGISTER;

	// Send register packet
	SendRegisterPacket();

	// Set an initial last Rx time
	gettimeofday(&LastRxActivityTime, NULL);

	// Setup cleanup function (closes the port)
	pthread_cleanup_push((void*)ControlCleanup, NULL);

	// While we should run (helps exit a thread cleanly)
	while(!ExitControlThread){

		struct timeval Timeout;
		fd_set readfds;
		int SelRet;

		FD_ZERO(&readfds);
		FD_SET(hControlPort, &readfds);

		// Wait 2 sec for UDP data
		Timeout.tv_sec = 2;
		Timeout.tv_usec = 0;
		SelRet = select(hControlPort+1, &readfds, NULL, NULL, &Timeout);

		// Error in select
		if(SelRet < 0){

			// Select error
			Log(LOG_ERR, "Error waiting for master packet");
		}
		// Data pending
		else if(SelRet > 0){

			// Get packet from master
			SockaddrLen = sizeof(FromAddr);
			PacketSize = recvfrom(hControlPort, PacketBuffer, sizeof(PacketBuffer), 0, (struct sockaddr *)&FromAddr, &SockaddrLen);

			// Check packet size
			if(PacketSize != sizeof(MASTERPACKET) + 2){

				// Wrong sized packet
				Log(LOG_ERR, "Client got packet of incorrect size");
			}
			else{

				// Check the checksum
				for(i = 0, j = 0; i < sizeof(MASTERPACKET); i++){
					j <<= 8;
					j += PacketBuffer[i];
				}
				if(PacketBuffer[i] != (USHORT)j){

					// Corrupted packet
					Log(LOG_ERR, "Client got corrupted packet");
				}
				else{

					int Packets, Bytes, Queue, k;

					if(ClientStatus != CS_CONNECTED)
						Log(LOG_INFO, "Client registered");

					// Update the status and last activity time
					ClientStatus = CS_CONNECTED;
					gettimeofday(&LastRxActivityTime, NULL);

					// Incriment poll count
					ClientStats.Polls++;

					// Send Packets up to allowed amount
					SendPackets(((MASTERPACKET*)PacketBuffer)->MaxPacketsToSend, ((MASTERPACKET*)PacketBuffer)->MaxBytesToSend);

					// Wait for access to the packet queue
					pthread_mutex_lock(&PacketQueueMutex);

					// Work out packets/bytes left in queues
					Packets = 0;
					Bytes = 0;
					for(Queue = 0; Queue < PacketQueues; Queue++){
						k = PacketQueueTail[Queue];
						while(PacketQueueHead[Queue] != k){
							Packets++;
							Bytes += ((ipq_packet_msg_t *)&PacketQueue[Queue][k * sizeof(struct ipq_packet_msg)])->data_len;
							k++;
							if(k >= Config.Queue)
								k = 0;
						}
					}

					// Release access to the packet queue
					pthread_mutex_unlock(&PacketQueueMutex);

					// Send 'done' packet
					memset(PacketBuffer, 0, sizeof(PacketBuffer));
					((CLIENTPACKET*)PacketBuffer)->TypeId = CLIENTID_END;
					((CLIENTPACKET*)PacketBuffer)->Rate = CurrentRate;
					((CLIENTPACKET*)PacketBuffer)->Signal = CurrentSignal;
					((CLIENTPACKET*)PacketBuffer)->Noise = CurrentNoise;
					((CLIENTPACKET*)PacketBuffer)->PacketsInQueue = Packets;
					((CLIENTPACKET*)PacketBuffer)->BytesInQueue = Bytes;
					for(i = 0, j = 0; i < sizeof(CLIENTPACKET); i++){
						j <<= 8;
						j += PacketBuffer[i];
					}
					PacketBuffer[i] = (USHORT)j;
					sendto(hControlPort, &PacketBuffer, sizeof(CLIENTPACKET)+2, 0, (struct sockaddr *)&MasterAddr, sizeof(MasterAddr));

					// Update the last activity time
					gettimeofday(&LastTxActivityTime, NULL);
				}
			}
		}

		// Do background processing here, this should run at least every 2 sec

		// Get current time
		gettimeofday(&NowTime, NULL);

		// If no Tx or Rx recently
		if(NowTime.tv_sec > LastRxActivityTime.tv_sec + SERVERREREGISTER &&
			NowTime.tv_sec > LastTxActivityTime.tv_sec + SERVERREREGISTER){

			// Reregister
			SendRegisterPacket();
		}

		// If no Rx for ages
		if(NowTime.tv_sec > LastRxActivityTime.tv_sec + SERVERTIMEOUT && ClientStatus != CS_NOSERVER){

			Log(LOG_INFO, "Client lost master connection");

			// Wait for access to the packet queue
			pthread_mutex_lock(&PacketQueueMutex);

			for(i = 0; i < PacketQueues; i++){

				// Send any/all packets in queue
				while(PacketQueueHead[i] != PacketQueueTail[i]){

					// Send the packet
					ipq_set_verdict(hIpq, ((ipq_packet_msg_t *)&PacketQueue[i][PacketQueueTail[i] * sizeof(struct ipq_packet_msg)])->packet_id, NF_ACCEPT, 0, NULL);

					PacketQueueTail[i]++;
					if(PacketQueueTail[i] >= Config.Queue)
						PacketQueueTail[i] = 0;
				}
			}

			// Release access to the packet queue
			pthread_mutex_unlock(&PacketQueueMutex);

			// Update the status to allow packets straight through
			ClientStatus = CS_NOSERVER;
		}

		// If no background processing for 10 sec (approx.)
		if(NowTime.tv_sec >= LastCtrlBackgroundTime.tv_sec + 10){

			// Update wireless data
			GetWirelessState();

			// Store intial background processing time
			gettimeofday(&LastCtrlBackgroundTime, NULL);

			if(Config.StatsFilename[0] != 0x00){
				// Start file write function in own threa
				//idWriteStatsFileThread = 0;
				//pthread_create(&idWriteStatsFileThread, NULL, &WriteStatsFile, NULL);
				// TODO: Figure out why doing it in a thread dies sooner or later (no further updates)
				WriteStatsFile(NULL);
			}

			//Reset poll count
			ClientStats.Polls = 0;
		}
	}

	// Call and clear cleanup function
	pthread_cleanup_pop(1);

	return NULL;
}
Beispiel #17
0
void ProcessSockets(void)
{
	if (socketpool.length >= events.capacity)
	{
		bprintf("Reserving more space for events\n");
		vec_reserve(&events, socketpool.length * 2);
	}

	bprintf("Entering epoll_wait\n");

	int total = epoll_wait(EpollHandle, &vec_first(&events), events.capacity, config->readtimeout * 1000);

	if (total == -1)
	{
		if (errno != EINTR)
			fprintf(stderr, "Error processing sockets: %s\n", strerror(errno));
		return;
	}

	for (int i = 0; i < total; ++i)
	{
		epoll_t *ev = &(events.data[i]);

		socket_t s;
		if (FindSocket(ev->data.fd, &s) == -1)
		{
			bfprintf(stderr, "Unknown FD in multiplexer: %d\n", ev->data.fd);
			// We don't know what socket this is. Someone added something
			// stupid somewhere so shut this shit down now.
			// We have to create a temporary socket_t object to remove it
			// from the multiplexer, then we can close it.
			socket_t tmp = { ev->data.fd, 0, 0, 0, 0 };
			RemoveFromMultiplexer(tmp);
			close(ev->data.fd);
			continue;
		}

		// Call our event.
		CallEvent(EV_SOCKETACTIVITY, &s);

		if (ev->events & (EPOLLHUP | EPOLLERR))
		{
			bprintf("Epoll error reading socket %d, destroying.\n", s.fd);
			DestroySocket(s, 1);
			continue;
		}

		// Process socket write events
		if (ev->events & EPOLLOUT && SendPackets(s) == -1)
		{
			bprintf("Destorying socket due to send failure!\n");
			DestroySocket(s, 1);
		}

		// process socket read events.
		if (ev->events & EPOLLIN && ReceivePackets(s) == -1)
		{
			bprintf("Destorying socket due to receive failure!\n");
			DestroySocket(s, 1);
		}
	}
}