int sendResponseLine(struct udpinfo *up, char *line, int len) { int rc; struct udpinfo u1; static unsigned long pkt[64]; u1.dport = up->sport; u1.dip.s_addr = up->sip.s_addr; u1.packet = (char *)pkt; u1.plen = sizeof(pkt); u1.udata = line; u1.ulen = len; if ((rc = udpSendTo(&u1)) < 0) unetError("sendResponseLine",rc,0); return(0); }
void LMEConnection::_apfGlobalRequest(unsigned char *rxBuffer, unsigned int bytesRead, int *status) { unsigned char *pCurrent; APF_GENERIC_HEADER *pHeader = (APF_GENERIC_HEADER *)rxBuffer; if (_strnicmp((char *)pHeader->String, APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST, APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST)) == 0) { LMETcpForwardRequestMessage tcpForwardRequest; unsigned int hsize = sizeof(APF_GENERIC_HEADER) + APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_REQUEST) + sizeof(UINT8); pCurrent = rxBuffer + hsize; bytesRead -= hsize; if (bytesRead < sizeof(UINT32)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } UINT32 len = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } tcpForwardRequest.Address.append((char *)pCurrent, len); pCurrent += len; tcpForwardRequest.Port = ntohl(*((UINT32 *)pCurrent)); _cb(_cbParam, &tcpForwardRequest, sizeof(tcpForwardRequest), status); } else if (_strnicmp((char *)pHeader->String, APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST, APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST)) == 0) { LMETcpForwardCancelRequestMessage tcpForwardCancelRequest; unsigned int hsize = sizeof(APF_GENERIC_HEADER) + APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_TCP_FORWARD_CANCEL_REQUEST) + sizeof(UINT8); pCurrent = rxBuffer + hsize; bytesRead -= hsize; if (bytesRead < sizeof(UINT32)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } UINT32 len = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } tcpForwardCancelRequest.Address.append((char *)pCurrent, len); pCurrent += len; tcpForwardCancelRequest.Port = ntohl(*((UINT32 *)pCurrent)); _cb(_cbParam, &tcpForwardCancelRequest, sizeof(tcpForwardCancelRequest), status); } else if (_strnicmp((char *)pHeader->String, APF_GLOBAL_REQUEST_STR_UDP_SEND_TO, APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO)) == 0) { unsigned int hsize = sizeof(APF_GENERIC_HEADER) + APF_STR_SIZE_OF(APF_GLOBAL_REQUEST_STR_UDP_SEND_TO) + sizeof(UINT8); pCurrent = rxBuffer + hsize; bytesRead -= hsize; if (bytesRead < sizeof(UINT32)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } UINT32 len = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32)); std::string address; address.append((char *)pCurrent, len); pCurrent += len; UINT32 port = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < sizeof(UINT32)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } // Skip Originator IP and Port len = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < (sizeof(UINT32) + len + sizeof(UINT32))) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } bytesRead -= (sizeof(UINT32) + len + sizeof(UINT32)); pCurrent += len; pCurrent += sizeof(UINT32); if (bytesRead < sizeof(UINT32)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } // Retrieve Data len = ntohl(*((UINT32 *)pCurrent)); pCurrent += sizeof(UINT32); if (bytesRead < (sizeof(UINT32) + len)) { PRINT("Error receiving data from HECI\n"); Deinit(); return; } LMEUdpSendToMessage udpSendTo(address, port, len, pCurrent); _cb(_cbParam, &udpSendTo, sizeof(udpSendTo), status); } }