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.tcp] - 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
 
8
#include "socketstream.h"
9
 
10
#include 
11
#include 
12
 
13
int SocketStream::listen(const char *host, int port)
14
{
15
    // Create a socket.
16
    so = socket(PF_INET, SOCK_STREAM, 0);
17
    if (so < 0) {
18
                cout << "Error creating socket." << endl;
19
                return -1;
20
    }
21
 
22
    // Allow listening port to be reused if defunct.
23
    int yes = 1;
24
    if (setsockopt(so, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) != 0) {
25
                cout << "Error configuring socket." << endl;
26
                return -1;
27
    }
28
 
29
        // Bind it to the listening port.
30
        memset(&addr, 0, sizeof addr);
31
        addr.sin_family = AF_INET;
32
        addr.sin_port = htons(port);
33
        inet_pton(AF_INET, host, &(addr.sin_addr));
34
        if (bind(so, (struct sockaddr*) &addr, sizeof (addr)) != 0) {
35
                 cout << "Error binding socket." << endl;
36
                 return -1;
37
        }
38
 
39
        // Listen for connections.
40
        if (::listen(so, NS_MAX_PENDING) != 0) {
41
                 cout << "Error listening on socket." << endl;
42
                 return -1;
43
        }
44
 
45
        bIsAlive = true;
46
 
47
#ifdef NS_DEBUG
48
        cout << "Listening on socket" << endl;
49
#endif
50
 
51
        return 0;
52
}
53
 
54
// accept a new connection
55
SocketStream* SocketStream::accept()
56
{
57
    struct sockaddr_in clientaddr;
58
    socklen_t clientaddrlen = sizeof clientaddr;
59
 
60
    int clientsock = ::accept(so, (struct sockaddr*)&clientaddr, &clientaddrlen);
61
    if (clientsock < 0)
62
    {
63
        cout << "Error accepting a connection";
64
        return NULL;
65
    }
66
 
67
    // prevent small packets from getting stuck in OS queues
68
    int on = 1;
69
    setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));
70
 
71
    return new SocketStream(clientsock, (struct sockaddr*)&clientaddr, clientaddrlen);
72
}
73
 
74
int SocketStream::connect(const char *host, int port)
75
{
76
    // Create a socket.
77
    so = socket(PF_INET, SOCK_STREAM, 0);
78
    if (so < 0) {
79
                cout << "Error creating socket." << endl;
80
                return -1;
81
    }
82
 
83
    // Get info about the server.
84
    struct addrinfo serveraddr, *res;
85
    memset(&serveraddr, 0, sizeof serveraddr);
86
    serveraddr.ai_family = AF_UNSPEC;
87
    serveraddr.ai_socktype = SOCK_STREAM;
88
    char portstr[NS_MAX_PORT_LEN];
89
    snprintf(portstr, sizeof portstr, "%d", port);
90
    int status = getaddrinfo(host, portstr, &serveraddr, &res);
91
 
92
    if (status != 0)
93
    {
94
        cout << "Host address not found" << endl;
95
        return -1;
96
    }
97
 
98
    // Connect to the server.
99
    status = ::connect(so, res->ai_addr, res->ai_addrlen);
100
    if (status != 0)
101
    {
102
        cout << "Connection failed." << endl;
103
        return -1;
104
    }
105
 
106
    // prevent small packets from getting stuck in OS queues
107
    int on = 1;
108
    setsockopt (so, SOL_TCP, TCP_NODELAY, &on, sizeof (on));
109
 
110
        bIsAlive = true;
111
 
112
#ifdef NS_DEBUG
113
        //cout << "Connected to host" << endl;
114
#endif
115
 
116
        return 0;
117
}
118
 
119
// read from the socket
120
int SocketStream::get(void *data, int number)
121
{
122
    //Socket soObj = so;
123
    //return soObj.get(data, number);
124
    int remaining = number;
125
    int received = 0;
126
    char *dataRemaining = (char*) data;
127
 
128
    errno = 0;
129
    while (remaining > 0 && (errno == 0 || errno == EINTR))
130
    {
131
        received = recv(so, dataRemaining, remaining, 0); // MSG_WAITALL
132
        // cout << "Got: " << received << endl;
133
        if (received > 0)
134
        {
135
            dataRemaining += received;
136
            remaining -= received;
137
        }
138
    }
139
 
140
    return number - remaining;
141
}
142
 
143
// write to socket
144
int SocketStream::put(const void *data, int number)
145
{
146
    //Socket soObj = so;
147
    //return soObj.put(data, number);
148
    // MSG_NOSIGNAL prevents SIGPIPE signal from being generated on failed send
149
    return send(so, data, number, MSG_NOSIGNAL);
150
}

powered by: WebSVN 2.1.0

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