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/] [traffic-generator/] [src/] [netstream/] [socketstream.tcp] - Rev 54

Compare with Previous | Blame | View Log

/*
 * socketstream.cpp
 *
 *  Created on: Dec 16, 2009
 *      Author: sam
 */

#include "socketstream.h"

#include <cstdio>
#include <cerrno>

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

    // Allow listening port to be reused if defunct.
    int yes = 1;
    if (setsockopt(so, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) != 0) {
                cout << "Error configuring socket." << endl;
                return -1;
    }

        // Bind it to the listening port.
        memset(&addr, 0, sizeof addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        inet_pton(AF_INET, host, &(addr.sin_addr));
        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_in 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)
{
    // Create a socket.
    so = socket(PF_INET, SOCK_STREAM, 0);
    if (so < 0) {
                cout << "Error creating socket." << endl;
                return -1;
    }

    // Get info about the server.
    struct addrinfo serveraddr, *res;
    memset(&serveraddr, 0, sizeof serveraddr);
    serveraddr.ai_family = AF_UNSPEC;
    serveraddr.ai_socktype = SOCK_STREAM;
    char portstr[NS_MAX_PORT_LEN];
    snprintf(portstr, sizeof portstr, "%d", port);
    int status = getaddrinfo(host, portstr, &serveraddr, &res);

    if (status != 0)
    {
        cout << "Host address not found" << endl;
        return -1;
    }

    // Connect to the server.
    status = ::connect(so, res->ai_addr, res->ai_addrlen);
    if (status != 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)
{
    //Socket soObj = so;
    //return soObj.get(data, 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
        // cout << "Got: " << received << endl;
        if (received > 0)
        {
            dataRemaining += received;
            remaining -= received;
        }
    }

    return number - remaining;
}

// write to socket
int SocketStream::put(const void *data, int number)
{
    //Socket soObj = so;
    //return soObj.put(data, 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.