summaryrefslogtreecommitdiff
path: root/i/simulotron/src/socket/socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'i/simulotron/src/socket/socket.cc')
-rw-r--r--i/simulotron/src/socket/socket.cc45
1 files changed, 45 insertions, 0 deletions
diff --git a/i/simulotron/src/socket/socket.cc b/i/simulotron/src/socket/socket.cc
index f231cf5..8b0ef99 100644
--- a/i/simulotron/src/socket/socket.cc
+++ b/i/simulotron/src/socket/socket.cc
@@ -21,6 +21,11 @@ Socket::Socket(int socket)
socket_ = socket;
}
+Socket::~Socket(void)
+{
+ close(socket_);
+}
+
void Socket::connect(const Address & address)
{
if (::connect (socket_, address.getSockaddr(), sizeof(*address.getSockaddr()) < 0))
@@ -47,4 +52,44 @@ Socket Socket::accept(Address & address)
return Socket(socket);
}
+std::string Socket::read(void)
+{
+ std::string str;
+ int charReaded;
+ char buffer[BUFFER_SIZE];
+
+ do
+ {
+ charReaded = ::read(socket_, buffer, BUFFER_SIZE - 1);
+ buffer[charReaded + 1] = 0;
+ str += buffer;
+ }while(charReaded == BUFFER_SIZE - 1);
+ return str;
+}
+
+void Socket::write(const std::string & str)
+{
+ char buffer[BUFFER_SIZE];
+ unsigned int pos = 0;
+ while(str.size() != pos)
+ {
+ int size = str.size() - pos < BUFFER_SIZE - 1 ? str.size() - pos:BUFFER_SIZE - 1;
+ str.copy(buffer, size, pos);
+ pos += size;
+ buffer[size] = 0;
+ ::write(socket_, buffer, size);
+ }
+}
+
+char Socket::getChar(void)
+{
+ char getted;
+ ::read(socket_, &getted, 1);
+ return getted;
+}
+
+void Socket::putChar(char c)
+{
+ ::write(socket_, &c, 1);
+}