1/* 2 * Copyright 2011, Axel D��rfler, axeld@pinc-software.de. 3 * Copyright 2016, Rene Gollent, rene@gollent.com. 4 * Distributed under the terms of the MIT License. 5 */ 6 7 8#include <Socket.h> 9 10#include <errno.h> 11 12 13//#define TRACE_SOCKET 14#ifdef TRACE_SOCKET 15# define TRACE(x...) printf(x) 16#else 17# define TRACE(x...) ; 18#endif 19 20 21BSocket::BSocket() 22{ 23} 24 25 26BSocket::BSocket(const BNetworkAddress& peer, bigtime_t timeout) 27{ 28 Connect(peer, timeout); 29} 30 31 32BSocket::BSocket(const BSocket& other) 33 : 34 BAbstractSocket(other) 35{ 36} 37 38 39BSocket::~BSocket() 40{ 41} 42 43 44status_t 45BSocket::Bind(const BNetworkAddress& local, bool reuseAddr) 46{ 47 return BAbstractSocket::Bind(local, reuseAddr, SOCK_STREAM); 48} 49 50 51status_t 52BSocket::Connect(const BNetworkAddress& peer, bigtime_t timeout) 53{ 54 return BAbstractSocket::Connect(peer, SOCK_STREAM, timeout); 55} 56 57 58status_t 59BSocket::Accept(BAbstractSocket*& _socket) 60{ 61 int fd = -1; 62 BNetworkAddress peer; 63 status_t error = AcceptNext(fd, peer); 64 if (error != B_OK) 65 return error; 66 BSocket* socket = new(std::nothrow) BSocket(); 67 if (socket == NULL) { 68 close(fd); 69 return B_NO_MEMORY; 70 } 71 72 socket->_SetTo(fd, fLocal, peer); 73 _socket = socket; 74 return B_OK; 75} 76 77 78// #pragma mark - BDataIO implementation 79 80 81ssize_t 82BSocket::Read(void* buffer, size_t size) 83{ 84 ssize_t bytesReceived = recv(Socket(), buffer, size, 0); 85 if (bytesReceived < 0) { 86 TRACE("%p: BSocket::Read() error: %s\n", this, strerror(errno)); 87 return errno; 88 } 89 90 return bytesReceived; 91} 92 93 94ssize_t 95BSocket::Write(const void* buffer, size_t size) 96{ 97 ssize_t bytesSent = send(Socket(), buffer, size, 0); 98 if (bytesSent < 0) { 99 TRACE("%p: BSocket::Write() error: %s\n", this, strerror(errno)); 100 return errno; 101 } 102 103 return bytesSent; 104} 105 106 107// #pragma mark - private 108 109 110void 111BSocket::_SetTo(int fd, const BNetworkAddress& local, 112 const BNetworkAddress& peer) 113{ 114 Disconnect(); 115 116 fInitStatus = B_OK; 117 fSocket = fd; 118 fLocal = local; 119 fPeer = peer; 120 fIsConnected = true; 121 122 TRACE("%p: accepted from %s to %s\n", this, local.ToString().c_str(), 123 peer.ToString().c_str()); 124} 125