19 Ocak 2015 Pazartesi

Windows'ta ARINC 653 Gerçekleştirimi - Queuing Port

UDP Socket ile gerçekleştirimi
Tüm kodlarda kullanılan bir std::map veriyapımız olsun.

std::map<int,SOCKET> dataMap;

CREATE_QUEUING_PORT
Socket açılır ve bir map içinde saklanır.

CREATE_QUEUING_PORT (
    QUEUING_PORT_NAME_TYPE dummy1,
    MESSAGE_SIZE_TYPE dummy2,
    MESSAGE_RANGE_TYPE dummy3,
    PORT_DIRECTION_TYPE portDirection,
    QUEUING_DISCIPLINE_TYPE dummy4,
    QUEUING_PORT_ID_TYPE portID,
    RETURN_CODE_TYPE * result) {
        SOCKET s = socket (AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if (portDirection == DESTINATION){ 
            //Bind UDP server
            struct sockaddr_in sAddr = {};
            sAddr.sin_family = AF_INET;
            sAddr.sin_port = portID;
            sAddr.sin_addr.s_add = inet_addr ("127.0.0.1");
            bind (sock,(struct sockaddr *) &sAddr, sizeof(sAddr));
         }
         //Save socket handle portID as key
         map [portID] = s;
         result = SUCCESS;
    }

SEND_QUEUING_MESSAGE
Veri socket üzerinden gönderilir.

SEND_QUEUING_MESSAGE (
    QUEUING_PORT_ID_TYPE portID,
    SYSTEM_TIME_TYPE dummy1,
    MESSAGE_ADDR_TYPE data,
    MESSAGE_SIZE_TYPE dataLength,
    RETURN_CODE_TYPE * result) {
        SOCKET s = dateMap [ portID ];
        int bytesSent = sendto (s, (char*) data, dataLength , 0);
        result = bytesSent < 0 ? FAIL : SUCCESS;
}

RECEIVE_QUEUING_MESSAGE
Veri socket üzerinden alınır.

RECEIVE_QUEUING_MESSAGE (
    QUEUING_PORT_ID_TYPE portID,
    SYSTEM_TIME_TYPE dummy1,
    MESSAGE_ADDR_TYPE data,
    MESSAGE_SIZE_TYPE dataLength,
    RETURN_CODE_TYPE * result) {
        SOCKET s = dateMap [ portID ];
        int bytesRcvd = recv (s, (char*) data, dataLength , 0);
        result = bytesRcvd < 0 ? FAIL : SUCCESS;
}


Hiç yorum yok:

Yorum Gönder