#include "interface/tcpsocket.h" #include #include #include #include #include #include #include // strerror() #include #include #include namespace interface { const unsigned char prefix[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; bool sockaddr_to_bytes(const sockaddr_storage *ptr, sv_ &to) { if(ptr->ss_family == AF_INET) { uchar *u = (uchar*) & ((struct sockaddr_in*)ptr)->sin_addr.s_addr; to.assign(u, u + 4); return true; } else if(ptr->ss_family == AF_INET6) { uchar *u = (uchar*) & ((struct sockaddr_in6*)ptr)->sin6_addr.s6_addr; if(memcmp(prefix, u, sizeof(prefix)) == 0){ to.assign(u + 12, u + 16); return true; } to.assign(u, u + 16); return true; } return false; }; std::string address_bytes_to_string(const sv_ &ip) { std::ostringstream os; for(size_t i = 0; i < ip.size(); i++){ if(ip.size() == 4){ os<ai_next, i++) { std::cerr<<"Trying addrinfo #"<ai_family, res->ai_socktype, res->ai_protocol); if(try_fd == -1){ std::cerr<<"socket: "<ai_addr, res->ai_addrlen) == -1){ std::cerr<<"connect: "<ai_next, i++) { //std::cerr<<"Trying addrinfo #"<ai_family, res->ai_socktype, res->ai_protocol); if(try_fd == -1){ //std::cerr<<"socket: "<ai_family == AF_INET6){ int val = 1; setsockopt(try_fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); } if(bind(try_fd, res->ai_addr, res->ai_addrlen) == -1){ //std::cerr<<"bind: "< a; if(!sockaddr_to_bytes(&sa, a)) return ""; return address_bytes_to_string(a); } ss_ get_remote_address() const { if(m_fd == -1) return ""; struct sockaddr_storage sa; socklen_t sa_len = sizeof(sa); if(getsockname(m_fd, (sockaddr*)&sa, &sa_len) == -1) return ""; sv_ a; if(!sockaddr_to_bytes(&sa, a)) return ""; return address_bytes_to_string(a); } }; TCPSocket* createTCPSocket(int fd) { return new CTCPSocket(fd); } }