Socket(const SocketAddress& address) :
mFd(-1),
+ mIsConnected(false),
mAddress(address)
{
mFd = socket(address.family(), address.type(), 0);
bool isConnected() const
{
- return mFd != -1;
+ return mIsConnected;
}
const SocketAddress& address() const
int connect()
{
- return ::connect(mFd, mAddress.address(), mAddress.size());
+ int result = ::connect(mFd, mAddress.address(), mAddress.size());
+ mIsConnected = result != -1;
+ return result;
}
int bind()
int set(int option, const std::string& value)
{
return setsockopt(mFd, SOL_SOCKET, option,
- value.c_str(), value.length());
+ value.data(), value.length());
}
int get(int option, int& value)
return result;
}
- void write(const Packet& packet)
+
+ ssize_t write(const void* bytes, size_t size)
{
- write(mAddress, packet);
+ return send(mFd, bytes, size, 0);
+ }
+ ssize_t write(const void* bytes, size_t size,
+ const SocketAddress& address)
+ {
+ return sendto(mFd, bytes, size, 0,
+ address.address(), address.size());
}
- void write(const SocketAddress& address, const Packet& packet)
+ ssize_t write(const Packet& packet)
{
- sendto(mFd, packet.bytes(), packet.size(), 0,
- address.address(), address.size());
+ return write(packet.bytes(), packet.size());
}
- Packet read()
+ ssize_t write(const Packet& packet, const SocketAddress& address)
{
- char buffer[1024];
- int size = recv(mFd, buffer, sizeof(buffer), 0);
+ return write(packet.bytes(), packet.size(), address);
+ }
- return Packet(buffer, size);
+
+ ssize_t read(void* bytes, size_t size)
+ {
+ return recv(mFd, bytes, size, 0);
}
- Packet read(SocketAddress& address)
+ ssize_t read(void* bytes, size_t size, SocketAddress& address)
{
union
{
} addr;
socklen_t length = sizeof(addr);
- char buffer[1024];
- int size = recvfrom(mFd, buffer, sizeof(buffer), 0,
- &addr.sa, &length);
+ ssize_t result = recvfrom(mFd, bytes, size, 0, &addr.sa, &length);
+ if (result != -1)
+ {
+ address = SocketAddress(&addr.sa, length, mAddress.type());
+ }
+ return result;
+ }
+
+ ssize_t read(Packet& packet)
+ {
+ char buffer[65536];
+ ssize_t result = read(buffer, sizeof(buffer));
+ if (result != -1) packet = Packet(buffer, result);
+ return result;
+ }
- address = SocketAddress(&addr.sa, length, mAddress.type());
- return Packet(buffer, size);
+ ssize_t read(Packet& packet, SocketAddress& address)
+ {
+ char buffer[65536];
+ ssize_t result = read(buffer, sizeof(buffer), address);
+ if (result != -1) packet = Packet(buffer, result);
+ return result;
}
int mFd;
+ bool mIsConnected;
SocketAddress mAddress;
};