| /* | 
 |  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 | #include <iostream> | 
 |  | 
 | #include "p2p/base/stun_server.h" | 
 | #include "rtc_base/async_udp_socket.h" | 
 | #include "rtc_base/socket_address.h" | 
 | #include "rtc_base/socket_server.h" | 
 | #include "rtc_base/thread.h" | 
 |  | 
 | using cricket::StunServer; | 
 |  | 
 | int main(int argc, char* argv[]) { | 
 |   if (argc != 2) { | 
 |     std::cerr << "usage: stunserver address" << std::endl; | 
 |     return 1; | 
 |   } | 
 |  | 
 |   rtc::SocketAddress server_addr; | 
 |   if (!server_addr.FromString(argv[1])) { | 
 |     std::cerr << "Unable to parse IP address: " << argv[1]; | 
 |     return 1; | 
 |   } | 
 |  | 
 |   rtc::Thread* pthMain = rtc::Thread::Current(); | 
 |  | 
 |   rtc::AsyncUDPSocket* server_socket = | 
 |       rtc::AsyncUDPSocket::Create(pthMain->socketserver(), server_addr); | 
 |   if (!server_socket) { | 
 |     std::cerr << "Failed to create a UDP socket" << std::endl; | 
 |     return 1; | 
 |   } | 
 |  | 
 |   StunServer* server = new StunServer(server_socket); | 
 |  | 
 |   std::cout << "Listening at " << server_addr.ToString() << std::endl; | 
 |  | 
 |   pthMain->Run(); | 
 |  | 
 |   delete server; | 
 |   return 0; | 
 | } |