dcc56bf748
When using the copy constructor of BNetEndpoint the socket of the original endpoint gets dup'ed. The Accept() method later directly reset the fSocket member of the newly created BNetEndpoint to the socket returned by accept(). The socket dup'ed by the copy constructor was therefore leaked. Of course dup'ing the socket and copying the local and remote addresses is superfluous in the accept case, as these members all get set to new values. To reduce that overhead there is now a new private constructor that directly gets the final socket and remote and local address.
108 lines
2.9 KiB
C++
108 lines
2.9 KiB
C++
/*
|
|
* Copyright 2006, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef H_NETENDPOINT
|
|
#define H_NETENDPOINT
|
|
|
|
|
|
#include <BeBuild.h>
|
|
#include <Archivable.h>
|
|
#include <NetAddress.h>
|
|
#include <NetBuffer.h>
|
|
#include <SupportDefs.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
|
|
class BNetEndpoint : public BArchivable {
|
|
public:
|
|
BNetEndpoint(int type = SOCK_STREAM);
|
|
BNetEndpoint(int family, int type, int protocol);
|
|
BNetEndpoint(const BNetEndpoint& other);
|
|
BNetEndpoint(BMessage* archive);
|
|
virtual ~BNetEndpoint();
|
|
|
|
BNetEndpoint& operator=(const BNetEndpoint& other);
|
|
|
|
status_t InitCheck() const;
|
|
|
|
virtual status_t Archive(BMessage* into, bool deep = true) const;
|
|
static BArchivable* Instantiate(BMessage* archive);
|
|
|
|
status_t SetProtocol(int protocol);
|
|
int SetOption(int32 option, int32 level, const void* data,
|
|
unsigned int dataSize);
|
|
int SetNonBlocking(bool on = true);
|
|
int SetReuseAddr(bool on = true);
|
|
|
|
const BNetAddress& LocalAddr() const;
|
|
const BNetAddress& RemoteAddr() const;
|
|
|
|
int Socket() const;
|
|
|
|
virtual void Close();
|
|
|
|
virtual status_t Bind(const BNetAddress& addr);
|
|
virtual status_t Bind(int port = 0);
|
|
virtual status_t Connect(const BNetAddress& addr);
|
|
virtual status_t Connect(const char* addr, int port);
|
|
virtual status_t Listen(int backlog = 5);
|
|
virtual BNetEndpoint* Accept(int32 timeout = -1);
|
|
|
|
int Error() const;
|
|
char* ErrorStr() const;
|
|
|
|
virtual int32 Send(const void* buffer, size_t size, int flags = 0);
|
|
virtual int32 Send(BNetBuffer& buffer, int flags = 0);
|
|
|
|
virtual int32 SendTo(const void* buffer, size_t size,
|
|
const BNetAddress& to, int flags = 0);
|
|
virtual int32 SendTo(BNetBuffer& buffer, const BNetAddress& to,
|
|
int flags = 0);
|
|
|
|
void SetTimeout(bigtime_t usec);
|
|
|
|
virtual int32 Receive(void* buffer, size_t size, int flags = 0);
|
|
virtual int32 Receive(BNetBuffer& buffer, size_t size, int flags = 0);
|
|
virtual int32 ReceiveFrom(void* buffer, size_t size, BNetAddress& from,
|
|
int flags = 0);
|
|
virtual int32 ReceiveFrom(BNetBuffer& buffer, size_t size,
|
|
BNetAddress& from, int flags = 0);
|
|
|
|
virtual bool IsDataPending(bigtime_t timeout = 0);
|
|
|
|
// TODO: drop these compatibility cruft methods after R1
|
|
status_t InitCheck();
|
|
const BNetAddress& LocalAddr();
|
|
const BNetAddress& RemoteAddr();
|
|
|
|
private:
|
|
BNetEndpoint(const BNetEndpoint& other, int socket,
|
|
const struct sockaddr_in& localAddress,
|
|
const struct sockaddr_in& peerAddress);
|
|
|
|
status_t _SetupSocket();
|
|
|
|
virtual void _ReservedBNetEndpointFBCCruft1();
|
|
virtual void _ReservedBNetEndpointFBCCruft2();
|
|
virtual void _ReservedBNetEndpointFBCCruft3();
|
|
virtual void _ReservedBNetEndpointFBCCruft4();
|
|
virtual void _ReservedBNetEndpointFBCCruft5();
|
|
virtual void _ReservedBNetEndpointFBCCruft6();
|
|
|
|
status_t fStatus;
|
|
int fFamily;
|
|
int fType;
|
|
int fProtocol;
|
|
int fSocket;
|
|
bigtime_t fTimeout;
|
|
BNetAddress fAddr;
|
|
BNetAddress fPeer;
|
|
|
|
int32 _reserved[16];
|
|
};
|
|
|
|
|
|
#endif // H_NETENDPOINT
|