OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_c/] [synfull/] [pronoc-interface/] [netstream/] [socketstream.unix] - Rev 54

Compare with Previous | Blame | View Log

/*
 * socketstream.cpp
 *
 *  Created on: Dec 16, 2009
 *      Author: sam
 * 
 * Modified by Wenbo Dai, University of Toronto, Aug 12, 2013
 * use Unix Socket, instead of Internet Socket
 */

#include "socketstream.h"

#include <cstdio>
#include <cerrno>

int SocketStream::listen(const char *host, int port)
{
        char *socket_path = "./socket";
    // Create a socket
        if ( (so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
                cout << "Error creating socket." << endl;
                return -1;
        }

        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_UNIX;
        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);

        // Bind it to the listening port
        unlink(socket_path);
        if (bind(so, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
                 cout << "Error binding socket." << endl;
                 return -1;
        }
        // Listen for connections
        if (::listen(so, NS_MAX_PENDING) != 0) {
                 cout << "Error listening on socket." << endl;
                 return -1;
        }
        bIsAlive = true;

#ifdef NS_DEBUG
        cout << "Listening on socket" << endl;
#endif

        return 0;
}

// accept a new connection
SocketStream* SocketStream::accept()
{
        struct sockaddr_un clientaddr;
        socklen_t clientaddrlen = sizeof clientaddr;
        int clientsock = ::accept(so, (struct sockaddr*)&clientaddr, &clientaddrlen);
        if ( clientsock < 0 ){
        cout << "Error accepting a connection";
        return NULL;
        }
        // prevent small packets from getting stuck in OS queues
        //int on = 1;
        //setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));

        return new SocketStream(clientsock, (struct sockaddr*)&clientaddr, clientaddrlen);
}

int SocketStream::connect(const char *host, int port)
{
        char *socket_path = "./socket";
        // Create a socket.
        if ( (so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
                cout << "Error creating socket." << endl;
                return -1;
        }
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_UNIX;
        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);

    // Connect to the server.
        if ( ::connect(so, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
        cout << "Connection failed." << endl;
        return -1;
        }

    // prevent small packets from getting stuck in OS queues
    //int on = 1;
    //setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));

        bIsAlive = true;

#ifdef NS_DEBUG
        cout << "Connected to host" << endl;
#endif

        return 0;
}

// read from the socket
int SocketStream::get(void *data, int number)
{

    int remaining = number;
    int received = 0;
    char *dataRemaining = (char*) data;

    errno = 0;
    while (remaining > 0 && (errno == 0 || errno == EINTR))
    {
        received = recv(so, dataRemaining, remaining, 0); // MSG_WAITALL
        if (received > 0)
        {
            dataRemaining += received;
            remaining -= received;
        }
    }

    return number - remaining;
}

// write to socket
int SocketStream::put(const void *data, int number)
{
    // MSG_NOSIGNAL prevents SIGPIPE signal from being generated on failed send
    return send(so, data, number, MSG_NOSIGNAL);
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.