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