/*============================================================================ * Get address information about the peer *===========================================================================*/ OpcUa_StatusCode OpcUa_P_RawSocket_GetPeerInfo( OpcUa_Socket a_RawSocket, OpcUa_CharA* a_achPeerInfoBuffer, OpcUa_UInt32 a_uiPeerInfoBufferSize) { int apiResult = 0; struct sockaddr_in sockAddrIn; size_t TempLen = sizeof(struct sockaddr_in); SOCKET winSocket = (SOCKET)OPCUA_P_SOCKET_INVALID; char* pchAddrBuf = OpcUa_Null; OpcUa_UInt16 usPort = 0; OpcUa_InitializeStatus(OpcUa_Module_Socket, "GetPeerInfo"); /* initial parameter check */ OpcUa_ReturnErrorIfTrue((a_RawSocket == (OpcUa_RawSocket)OPCUA_P_SOCKET_INVALID), OpcUa_BadInvalidArgument); OpcUa_ReturnErrorIfTrue((a_uiPeerInfoBufferSize < OPCUA_P_PEERINFO_MIN_SIZE), OpcUa_BadInvalidArgument); OpcUa_ReturnErrorIfArgumentNull(a_achPeerInfoBuffer); winSocket = (SOCKET)a_RawSocket; apiResult = getpeername(winSocket, (struct sockaddr*)&sockAddrIn, (int*)&TempLen); OpcUa_ReturnErrorIfTrue((apiResult != 0), OpcUa_BadInternalError); /* IP */ pchAddrBuf = inet_ntoa(sockAddrIn.sin_addr); OpcUa_GotoErrorIfTrue(pchAddrBuf == OpcUa_Null, OpcUa_BadInternalError); /* Port */ usPort = OpcUa_P_RawSocket_NToHS((OpcUa_UInt16)sockAddrIn.sin_port); /* build result string */ TempLen = strlen(pchAddrBuf); #if OPCUA_USE_SAFE_FUNCTIONS OpcUa_GotoErrorIfTrue((strncpy_s(a_achPeerInfoBuffer, a_uiPeerInfoBufferSize + 1, pchAddrBuf, TempLen) != 0), OpcUa_Bad); a_achPeerInfoBuffer[TempLen] = ':'; TempLen++; sprintf_s(&a_achPeerInfoBuffer[TempLen], a_uiPeerInfoBufferSize - TempLen, "%u", usPort); #else /* OPCUA_USE_SAFE_FUNCTIONS */ OpcUa_GotoErrorIfTrue((strncpy(a_achPeerInfoBuffer, pchAddrBuf, TempLen) != a_achPeerInfoBuffer), OpcUa_Bad); a_achPeerInfoBuffer[TempLen] = ':'; sprintf(&a_achPeerInfoBuffer[TempLen + 1], "%u", usPort); #endif /* OPCUA_USE_SAFE_FUNCTIONS */ OpcUa_ReturnStatusCode; OpcUa_BeginErrorHandling; OpcUa_FinishErrorHandling; }
/*============================================================================ * Get IP Address and Port Number of the local connection *===========================================================================*/ OpcUa_StatusCode OpcUa_P_RawSocket_GetLocalInfo( OpcUa_RawSocket a_RawSocket, OpcUa_UInt32* a_pIP, OpcUa_UInt16* a_pPort) { int apiResult = 0; struct sockaddr_in sockAddrIn; size_t sockAddrInLen = sizeof(struct sockaddr_in); SOCKET winSocket = (SOCKET)OPCUA_P_SOCKET_INVALID; OpcUa_InitializeStatus(OpcUa_Module_Socket, "GetLocalInfo"); if(a_RawSocket == (OpcUa_RawSocket)OPCUA_P_SOCKET_INVALID) { return 0; } winSocket = (SOCKET)a_RawSocket; apiResult = getsockname(winSocket, (struct sockaddr*)&sockAddrIn, (int*)&sockAddrInLen); if(apiResult != 0) { apiResult = OpcUa_P_RawSocket_GetLastError(a_RawSocket); uStatus = OpcUa_BadCommunicationError; goto Error; } if(a_pIP != OpcUa_Null) { *a_pIP = OpcUa_P_RawSocket_NToHL((OpcUa_UInt32)sockAddrIn.sin_addr.s_addr); } if(a_pPort != OpcUa_Null) { *a_pPort = OpcUa_P_RawSocket_NToHS((OpcUa_UInt16)sockAddrIn.sin_port); } OpcUa_ReturnStatusCode; OpcUa_BeginErrorHandling; OpcUa_FinishErrorHandling; }
OpcUa_UInt16 OPCUA_DLLCALL OpcUa_P_Socket_NToHS(OpcUa_UInt16 a_netShort) { return OpcUa_P_RawSocket_NToHS(a_netShort); }