home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 4 / CD_Magazyn_EXEC_nr_4.iso / Recent / dev / c / GSys.lha / gsys / gmisc / GSocket.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-19  |  3.7 KB  |  206 lines

  1.  
  2. /* Author Anders Kjeldsen */
  3.  
  4. #ifndef GSOCKET_CPP
  5. #define GSOCKET_CPP
  6.  
  7. #include "gmisc/GSocket.h"
  8. #include "gsystem/GObject.cpp"
  9. #include "gmisc/GServer.cpp"
  10.  
  11. GSocket::GSocket()
  12. {
  13.     memset((void *)this, 0, sizeof (GSocket) );
  14.  
  15.     if ( InitObject("GSocket") )
  16.     {
  17.     }
  18. }
  19.  
  20. GSocket::~GSocket()
  21. {
  22.     if ( Socket )
  23.     {
  24.         shutdown(Socket, SD_SEND);
  25.         closesocket(Socket);
  26.     }
  27. }
  28.  
  29. GWORD GSocket::Init(int af, int type, int prot)
  30. {
  31.     if ( IsErrorFree() )
  32.     {
  33.         if ( !WSAver )
  34.         {
  35.             WSAver = MAKEWORD(2, 2);
  36.             WSAStartup(WSAver, &WSAdata);
  37.         }
  38.         Socket = socket(af, type, prot);
  39.         return TRUE;
  40.     }
  41.     else return FALSE;
  42. }                    
  43.  
  44. GServer *GSocket::GetGServer()
  45. {
  46.     return MServer;
  47. }
  48.  
  49. GSocket *GSocket::GetNext()
  50. {
  51.     return Next;
  52. }
  53.  
  54. GSocket *GSocket::GetPrev()
  55. {
  56.     return Prev;
  57. }
  58.  
  59. BOOL GSocket::SetGServer(GServer *server)
  60. {
  61.     MServer = server;
  62.     return TRUE;
  63. }
  64.  
  65. BOOL GSocket::SetNext(GSocket *next)
  66. {
  67.     Next = next;
  68.     return TRUE;
  69. }
  70.  
  71. BOOL GSocket::SetPrev(GSocket *prev)
  72. {
  73.     Prev = prev;
  74.     return TRUE;
  75. }
  76.  
  77. BOOL GSocket::SetSocket(SOCKET s)
  78. {
  79.     if ( IsErrorFree() )
  80.     {
  81.         WriteLog("Socket Set\n");
  82.         Socket = s;
  83.         return TRUE;
  84.     }
  85.     else return FALSE;
  86. }
  87.  
  88. /*
  89. GWORD GSocket::SetLocalAddress(GSTRPTR address, GUWORD port)
  90. {
  91.     struct servent *sp;
  92.     struct hostent *hp;
  93.     char *endptr;
  94.     
  95.     Local.sin_family = AF_INET;
  96.     Local.sin_addr.s_addr = INADDR_ANY;
  97.     Local.sin_port = htons(PORT);
  98.  
  99.     if (address)
  100.     {
  101.         if ( !inet_aton( address, &Local->sin_addr)
  102.         {
  103.             hp = gethostbyname(address)
  104.             if (hp == NULL)
  105.             {
  106.                 return 0;
  107.             }
  108.             sap->sin_addr = *hp->h_name;
  109.         }
  110.     }
  111.     return 1;        
  112. }
  113. */
  114. GWORD GSocket::SockRecv(char *buffer, GWORD len, GWORD flags)
  115. {
  116.     if ( Socket && IsErrorFree() )
  117.     {
  118.         int c;
  119.         c = recv(Socket, buffer, len, flags);
  120.         WriteLog((char *)buffer);
  121.         return c;
  122.     }
  123.     else return -1;
  124. }
  125.  
  126. GWORD GSocket::SockSend(char *buffer, GWORD len, GWORD flags)
  127. {
  128.     if ( Socket && IsErrorFree() )
  129.     {
  130.         WriteLog((char *)buffer);
  131.         return send(Socket, buffer, len, flags);
  132.     }
  133.     else return -1;
  134. }
  135.  
  136. GWORD GSocket::SockListen()
  137. {
  138.     if ( Socket && IsErrorFree() ) return listen(Socket, 5);
  139.     else return -1;
  140. }
  141.  
  142. GWORD GSocket::SockBind(GSTRPTR address, GUWORD port)
  143. {
  144.     if ( Socket && IsErrorFree())
  145.     {
  146.         LocalAddr.sin_family = AF_INET;
  147.         LocalAddr.sin_addr.s_addr = INADDR_ANY;
  148.         LocalAddr.sin_port = htons(port);
  149.  
  150.         return bind(Socket, (sockaddr *)&LocalAddr, sizeof(sockaddr_in));
  151.     }
  152.     else return 0;
  153. }
  154.  
  155. GWORD GSocket::SockSetOpt(GWORD level, GWORD optname, char *optval, GWORD optlen)
  156. {
  157.     if ( Socket && IsErrorFree() ) return setsockopt(Socket, level, optname, optval, optlen);
  158.     else return -1;
  159. }
  160.  
  161. GWORD GSocket::SockConnect(GSTRPTR address, GUWORD port)
  162. {
  163.     if ( Socket && IsErrorFree() )
  164.     {
  165. /*        Hostent = gethostbyaddr(address, strlen(address), 0);
  166.         if ( ! Hostent )
  167.         {
  168.             WriteLog("Wrong Hostent\n");
  169.             Hostent = gethostbyname(address);
  170.         }
  171. */
  172. //        if (Hostent && Hostent->h_name)
  173. //        {
  174.             if (address)
  175.             {
  176.                 GUWORD ipadd = inet_addr(address);
  177.                 char gg[128];
  178.                 sprintf(gg, "address: 0x%x\n", ipadd);
  179.                 WriteLog(gg);
  180.                 PeerAddr.sin_family = AF_INET;
  181.                 PeerAddr.sin_addr.S_un.S_addr = ipadd; //*(struct in_addr *)Hostent->h_name;
  182.                 PeerAddr.sin_port = htons(port);
  183.                 return connect(Socket, (sockaddr *)&PeerAddr, sizeof(sockaddr_in));
  184.             }
  185. //        }
  186.     }
  187.     return 0;
  188. }
  189.  
  190. GSocket *GSocket::SockAccept()
  191. {
  192.     if ( Socket && IsErrorFree() )
  193.     {
  194.         int peerlen = sizeof (PeerAddr);
  195.         GSocket *newsock = new GSocket();
  196.         newsock->SetSocket( accept(Socket, (sockaddr *)&PeerAddr, &peerlen) );
  197. //        WriteLog("name ");
  198. //        WriteLog((char *)&PeerAddr.sin_addr);
  199. //        WriteLog("\n");
  200.         return newsock;
  201.     }
  202.     else return NULL;
  203. }
  204.  
  205. #endif /* GSOCKET_CPP */
  206.