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);
}