]> git.stg.codes - stg.git/blob - stglibs/sgcp.lib/tcp.cpp
414d5ec84322c37153f0a29ad86087f10b53ef22
[stg.git] / stglibs / sgcp.lib / tcp.cpp
1 #include "tcp.h"
2
3 #include "stg/sgcp_utils.h"
4
5 #include <cerrno>
6 #include <cstring>
7
8 #include <sys/types.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <netinet/tcp.h>
12
13 using STG::SGCP::TCPProto;
14
15 TCPProto::TCPProto()
16     : m_sock(socket(AF_INET, SOCK_STREAM, 0))
17 {
18 }
19
20 TCPProto::~TCPProto()
21 {
22     close(m_sock);
23 }
24
25 void TCPProto::connect(const std::string& address, uint16_t port)
26 {
27     std::vector<in_addr> addrs = resolve(address);
28
29     for (size_t i = 0; i < addrs.size(); ++i) {
30         sockaddr_in addr;
31         addr.sin_family = AF_INET;
32         addr.sin_port = hton(port);
33         addr.sin_addr = addrs[i];
34
35         if (::connect(m_sock, reinterpret_cast<const sockaddr*>(&addr), sizeof(addr)) == 0)
36             return;
37
38         close(m_sock);
39         m_sock = socket(AF_INET, SOCK_STREAM, 0);
40     }
41     throw Error("No more addresses to connect to.");
42 }
43
44 ssize_t TCPProto::write(const void* buf, size_t size)
45 {
46     return ::write(m_sock, buf, size);
47 }
48
49 ssize_t TCPProto::read(void* buf, size_t size)
50 {
51     return ::read(m_sock, buf, size);
52 }