示例#1
0
/*============================================================================
 * 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;
}
示例#2
0
/*============================================================================
 * 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);
}