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] - Blame information for rev 54

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 54 alirezamon
/*
2
 * socketstream.cpp
3
 *
4
 *  Created on: Dec 16, 2009
5
 *      Author: sam
6
 *
7
 * Modified by Wenbo Dai, University of Toronto, Aug 12, 2013
8
 * use Unix Socket, instead of Internet Socket
9
 */
10
 
11
#include "socketstream.h"
12
 
13
#include 
14
#include 
15
 
16
int SocketStream::listen(const char *host, int port)
17
{
18
        char *socket_path = "./socket";
19
    // Create a socket
20
        if ( (so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
21
                cout << "Error creating socket." << endl;
22
                return -1;
23
        }
24
 
25
        memset(&addr, 0, sizeof(addr));
26
        addr.sun_family = AF_UNIX;
27
        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);
28
 
29
        // Bind it to the listening port
30
        unlink(socket_path);
31
        if (bind(so, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
32
                 cout << "Error binding socket." << endl;
33
                 return -1;
34
        }
35
        // Listen for connections
36
        if (::listen(so, NS_MAX_PENDING) != 0) {
37
                 cout << "Error listening on socket." << endl;
38
                 return -1;
39
        }
40
        bIsAlive = true;
41
 
42
#ifdef NS_DEBUG
43
        cout << "Listening on socket" << endl;
44
#endif
45
 
46
        return 0;
47
}
48
 
49
// accept a new connection
50
SocketStream* SocketStream::accept()
51
{
52
        struct sockaddr_un clientaddr;
53
        socklen_t clientaddrlen = sizeof clientaddr;
54
        int clientsock = ::accept(so, (struct sockaddr*)&clientaddr, &clientaddrlen);
55
        if ( clientsock < 0 ){
56
        cout << "Error accepting a connection";
57
        return NULL;
58
        }
59
        // prevent small packets from getting stuck in OS queues
60
        //int on = 1;
61
        //setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));
62
 
63
        return new SocketStream(clientsock, (struct sockaddr*)&clientaddr, clientaddrlen);
64
}
65
 
66
int SocketStream::connect(const char *host, int port)
67
{
68
        char *socket_path = "./socket";
69
        // Create a socket.
70
        if ( (so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
71
                cout << "Error creating socket." << endl;
72
                return -1;
73
        }
74
        memset(&addr, 0, sizeof(addr));
75
        addr.sun_family = AF_UNIX;
76
        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);
77
 
78
    // Connect to the server.
79
        if ( ::connect(so, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
80
        cout << "Connection failed." << endl;
81
        return -1;
82
        }
83
 
84
    // prevent small packets from getting stuck in OS queues
85
    //int on = 1;
86
    //setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));
87
 
88
        bIsAlive = true;
89
 
90
#ifdef NS_DEBUG
91
        cout << "Connected to host" << endl;
92
#endif
93
 
94
        return 0;
95
}
96
 
97
// read from the socket
98
int SocketStream::get(void *data, int number)
99
{
100
 
101
    int remaining = number;
102
    int received = 0;
103
    char *dataRemaining = (char*) data;
104
 
105
    errno = 0;
106
    while (remaining > 0 && (errno == 0 || errno == EINTR))
107
    {
108
        received = recv(so, dataRemaining, remaining, 0); // MSG_WAITALL
109
        if (received > 0)
110
        {
111
            dataRemaining += received;
112
            remaining -= received;
113
        }
114
    }
115
 
116
    return number - remaining;
117
}
118
 
119
// write to socket
120
int SocketStream::put(const void *data, int number)
121
{
122
    // MSG_NOSIGNAL prevents SIGPIPE signal from being generated on failed send
123
    return send(so, data, number, MSG_NOSIGNAL);
124
}

powered by: WebSVN 2.1.0

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