Share Pastebin
Guest
Public paste!

Socket.cpp

By: a guest | Mar 18th, 2010 | Syntax: C++ | Size: 1.76 KB | Hits: 62 | Expires: Never
Copy text to clipboard
  1. /* Socket.cpp */
  2.  
  3. #include "Socket.h"
  4. #include "string.h"
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <iostream>
  9.  
  10. Socket::Socket(const std::string s, const std::string p) : m_sock(-1), server(s), port(p)
  11. {
  12.   memset ( &hints, 0, sizeof ( hints ) );
  13.   hints.ai_family = AF_INET;
  14.   hints.ai_socktype = SOCK_STREAM;
  15. }
  16.  
  17. Socket::~Socket()
  18. {
  19.   if ( is_valid() ) ::close ( m_sock );
  20. }
  21.  
  22.  
  23. bool Socket::get_address()
  24. {
  25.   int rv = 1;
  26.   rv = getaddrinfo(server.c_str(), port.c_str(), &hints, &servinfo);
  27. // for debugging:  fprintf(stderr, "getaddrinfo: %i\n", rv);
  28.   if (rv != 0) return false;
  29.   return true;
  30. }
  31.  
  32. void *get_in_addr(struct sockaddr *sa)
  33. {
  34.     if (sa->sa_family == AF_INET) {
  35.         return &(((struct sockaddr_in*)sa)->sin_addr);
  36.     }
  37.  
  38.     return &(((struct sockaddr_in6*)sa)->sin6_addr);
  39. }
  40.  
  41. bool Socket::connect ()
  42. {
  43.   struct addrinfo *p;
  44.   int rv, connected;
  45.   char s[INET6_ADDRSTRLEN];
  46.  
  47.   for(p = servinfo; p != NULL; p = p->ai_next) {
  48.     m_sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
  49.     if (m_sock == -1) continue;
  50.     int connected = ::connect(m_sock, p->ai_addr, p->ai_addrlen);
  51.     if (connected == -1){
  52.       close(m_sock);
  53.       continue;}
  54.     break;
  55.   }
  56.  
  57.   if (connected == -1) return false;
  58.  
  59.   inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s);
  60.   return true;
  61. }
  62.  
  63. const Socket& Socket::operator >> (std::string& s) const
  64. {
  65.   char buf [ MAXRECV + 1 ];
  66.   s = "";
  67.   memset ( buf, 0, MAXRECV + 1 );
  68.   ::recv ( m_sock, buf, MAXRECV, 0 );
  69.   s = buf;
  70.   std::cout << ">> " + s << "\n";
  71.   return *this;
  72. }
  73.  
  74. const Socket& Socket::operator << (const std::string& s) const
  75. {
  76.   ::send ( m_sock, s.c_str(), s.size(), 0 );
  77.   std::cout << "<< " + s << "\n";
  78. }