00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00026
00028 #include <SFML/Network/IPAddress.hpp>
00029 #include <SFML/Network/Sockets.hpp>
00030
00031
00035 const sfIPAddress sfIPAddress::LocalHost("127.0.0.1");
00036
00037
00041 sfIPAddress::sfIPAddress() :
00042 myAddress(INADDR_NONE)
00043 {
00044
00045 }
00046
00047
00051 sfIPAddress::sfIPAddress(const std::string& Address)
00052 {
00053
00054 myAddress = inet_addr(Address.c_str());
00055
00056
00057 if (!IsValid())
00058 {
00059 hostent* Host = gethostbyname(Address.c_str());
00060 if (Host)
00061 {
00062
00063 myAddress = reinterpret_cast<in_addr*>(Host->h_addr)->s_addr;
00064 }
00065 else
00066 {
00067
00068 myAddress = INADDR_NONE;
00069 }
00070 }
00071 }
00072
00073
00077 sfIPAddress::sfIPAddress(sfUint8 Byte0, sfUint8 Byte1, sfUint8 Byte2, sfUint8 Byte3)
00078 {
00079 myAddress = htonl((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
00080 }
00081
00082
00086 bool sfIPAddress::IsValid() const
00087 {
00088 return myAddress != INADDR_NONE;
00089 }
00090
00091
00095 std::string sfIPAddress::ToString() const
00096 {
00097 in_addr InAddr;
00098 InAddr.s_addr = myAddress;
00099
00100 return inet_ntoa(InAddr);
00101 }
00102
00103
00107 sfIPAddress sfIPAddress::GetLocalAddress()
00108 {
00109
00110
00111
00112
00113 sfIPAddress LocalAddress;
00114
00115
00116 sf_private::sfSocketType Socket = socket(PF_INET, SOCK_DGRAM, 0);
00117 if (Socket == INVALID_SOCKET)
00118 return LocalAddress;
00119
00120
00121 sockaddr_in SockAddr;
00122 memset(SockAddr.sin_zero, 0, sizeof(SockAddr.sin_zero));
00123 SockAddr.sin_addr.s_addr = INADDR_LOOPBACK;
00124 SockAddr.sin_family = AF_INET;
00125 SockAddr.sin_port = htons(4567);
00126
00127
00128 if (connect(Socket, reinterpret_cast<sockaddr*>(&SockAddr), sizeof(SockAddr)) == -1)
00129 {
00130 sf_private::close(Socket);
00131 return LocalAddress;
00132 }
00133
00134
00135 socklen_t Size = sizeof(SockAddr);
00136 if (getsockname(Socket, reinterpret_cast<sockaddr*>(&SockAddr), &Size) == -1)
00137 {
00138 sf_private::close(Socket);
00139 return LocalAddress;
00140 }
00141
00142
00143 sf_private::close(Socket);
00144
00145
00146 LocalAddress.myAddress = SockAddr.sin_addr.s_addr;
00147
00148 return LocalAddress;
00149 }
00150
00151
00155 sfIPAddress sfIPAddress::GetPublicAddress()
00156 {
00157
00158
00159
00160
00161
00162
00163 sfIPAddress PublicAddress;
00164
00165
00166 sf_private::sfSocketType Socket = socket(PF_INET, SOCK_STREAM, 0);
00167 if (Socket == INVALID_SOCKET)
00168 return PublicAddress;
00169
00170
00171 sfIPAddress Server("www.whatismyip.org");
00172 sockaddr_in SockAddr;
00173 memset(SockAddr.sin_zero, 0, sizeof(SockAddr.sin_zero));
00174 SockAddr.sin_addr.s_addr = inet_addr(Server.ToString().c_str());
00175 SockAddr.sin_family = AF_INET;
00176 SockAddr.sin_port = htons(80);
00177
00178
00179 if (connect(Socket, reinterpret_cast<sockaddr*>(&SockAddr), sizeof(SockAddr)) == -1)
00180 {
00181 sf_private::close(Socket);
00182 return PublicAddress;
00183 }
00184
00185
00186 const char Request[] = "GET / HTTP/1.0\r\n"
00187 "From: camembert@fromage.com\r\n"
00188 "User-Agent: SFML/1.0\r\n"
00189 "\r\n";
00190 if (send(Socket, Request, sizeof(Request), 0) <= 0)
00191 {
00192 sf_private::close(Socket);
00193 return PublicAddress;
00194 }
00195
00196
00197 char Response[1024];
00198 int Received = recv(Socket, Response, sizeof(Response), 0);
00199 if (Received <= 0)
00200 {
00201 sf_private::close(Socket);
00202 return PublicAddress;
00203 }
00204
00205
00206 sf_private::close(Socket);
00207
00208
00209
00210 std::string Page(Response, Received);
00211 std::string::size_type Start = Page.find("\r\n\r\n");
00212 if (Start != std::string::npos)
00213 {
00214 PublicAddress = Page.substr(Start + 4);
00215 }
00216
00217 return PublicAddress;
00218 }
00219
00220
00224 bool sfIPAddress::operator ==(const sfIPAddress& Other) const
00225 {
00226 return myAddress == Other.myAddress;
00227 }
00228
00229
00233 bool sfIPAddress::operator !=(const sfIPAddress& Other) const
00234 {
00235 return myAddress != Other.myAddress;
00236 }
00237
00238
00242 bool sfIPAddress::operator <(const sfIPAddress& Other) const
00243 {
00244 return myAddress < Other.myAddress;
00245 }
00246
00247
00251 bool sfIPAddress::operator >(const sfIPAddress& Other) const
00252 {
00253 return myAddress > Other.myAddress;
00254 }
00255
00256
00260 bool sfIPAddress::operator <=(const sfIPAddress& Other) const
00261 {
00262 return myAddress <= Other.myAddress;
00263 }
00264
00265
00269 bool sfIPAddress::operator >=(const sfIPAddress& Other) const
00270 {
00271 return myAddress >= Other.myAddress;
00272 }
00273
00274
00278 std::istream& operator >>(std::istream& Stream, sfIPAddress& Address)
00279 {
00280 std::string Str;
00281 Stream >> Str;
00282 Address = sfIPAddress(Str);
00283
00284 return Stream;
00285 }
00286
00287
00291 std::ostream& operator <<(std::ostream& Stream, const sfIPAddress& Address)
00292 {
00293 return Stream << Address.ToString();
00294 }