00001 #ifndef WBSOCKET_H 00002 #define WBSOCKET_H 00003 00004 #include "WBWin.h" 00005 #include <winsock2.h> 00006 #include <ws2tcpip.h> 00007 #include <iostream> 00008 #include <vector> 00009 00010 class SPR_DLL WBSockAddr{ 00011 protected: 00012 SOCKADDR adr; 00013 public: 00014 WBSockAddr(); 00015 WBSockAddr(const SOCKADDR& a):adr(a){} 00016 WBSockAddr(const SOCKADDR_IN& a):adr((const SOCKADDR&)a){} 00017 WBSockAddr(const char* adr, int port){Set(adr, port);} 00018 SOCKADDR& Adr(){return adr;} 00019 const SOCKADDR& Adr() const {return adr;} 00020 SOCKADDR_IN& AdrIn(){return (SOCKADDR_IN&)adr;} 00021 const SOCKADDR_IN& AdrIn() const {return (SOCKADDR_IN&)adr;} 00022 operator SOCKADDR&(){return adr;} 00023 operator const SOCKADDR&() const {return adr;} 00024 operator SOCKADDR_IN&(){return (SOCKADDR_IN&)adr;} 00025 operator const SOCKADDR_IN&() const {return (SOCKADDR_IN&)adr;} 00026 operator SOCKADDR*(){return &adr;} 00027 operator const SOCKADDR*() const {return &adr;} 00028 operator SOCKADDR_IN*(){return (SOCKADDR_IN*)&adr;} 00029 operator const SOCKADDR_IN*() const {return (const SOCKADDR_IN*)&adr;} 00030 void Set(const char* adr, int port); 00031 void Print(std::ostream& os) const; 00032 friend bool operator == (const WBSockAddr& a, const WBSockAddr& b); 00033 }; 00034 inline std::ostream& operator << (std::ostream& os, const WBSockAddr& w){ w.Print(os); return os; } 00035 inline bool operator == (const WBSockAddr& a, const WBSockAddr& b){ 00036 return a.AdrIn().sin_family == b.AdrIn().sin_family 00037 && a.AdrIn().sin_addr.S_un.S_addr == b.AdrIn().sin_addr.S_un.S_addr 00038 && a.AdrIn().sin_port == b.AdrIn().sin_port; 00039 } 00040 00041 class SPR_DLL WBSocket{ 00042 SOCKET sock; 00043 void InitWinsock(); 00044 public: 00045 WBSocket(int af=AF_INET, int type=SOCK_DGRAM, int protocol=0); 00046 void Init(int af=AF_INET, int type=SOCK_DGRAM, int protocol=0); 00047 ~WBSocket(); 00048 operator SOCKET(){ return sock; } 00049 int SendTo(void* buf, size_t len, const WBSockAddr& a); 00050 bool CanRecv(); 00051 int RecvFrom(void* buf, size_t len, WBSockAddr& a); 00052 bool Bind(const WBSockAddr& a); 00053 static char* GetErrorString(); 00054 static char* GetErrorString(int errorNum); 00055 }; 00056 class SPR_DLL WBNetInterface{ 00057 protected: 00058 WBSockAddr addr; 00059 WBSockAddr mask; 00060 WBSockAddr broadcast; 00061 public: 00062 WBNetInterface(const INTERFACE_INFO& info); 00063 const WBSockAddr& Addr(){ return addr; } 00064 const WBSockAddr& Mask(){ return mask; } 00065 const WBSockAddr& Broadcast(){ return broadcast; } 00066 void Print(std::ostream& os) const; 00067 }; 00068 inline std::ostream& operator << (std::ostream& os, const WBNetInterface& w){ w.Print(os); return os; } 00069 class SPR_DLL WBNetInterfaces:public std::vector<WBNetInterface>{ 00070 protected: 00071 public: 00072 void Init(); 00073 void Print(std::ostream& os) const; 00074 }; 00075 inline std::ostream& operator << (std::ostream& os, const WBNetInterfaces& w){ w.Print(os); return os; } 00076 #endif