11391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen/* 21391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * libjingle 31391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * Copyright 2004--2005, Google Inc. 41391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 51391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * Redistribution and use in source and binary forms, with or without 61391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * modification, are permitted provided that the following conditions are met: 71391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 81391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 1. Redistributions of source code must retain the above copyright notice, 91391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * this list of conditions and the following disclaimer. 101391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright notice, 111391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * this list of conditions and the following disclaimer in the documentation 121391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * and/or other materials provided with the distribution. 131391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 3. The name of the author may not be used to endorse or promote products 141391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * derived from this software without specific prior written permission. 151391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * 161391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 171391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 181391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 191391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 201391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 211391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 221391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 231391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 241391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 251391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 261391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen */ 271391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 281391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen#include <iostream> // NOLINT 291391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 301391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen#include "talk/base/thread.h" 311391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen#include "talk/base/scoped_ptr.h" 321391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen#include "talk/p2p/base/relayserver.h" 331391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 341391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsenint main(int argc, char **argv) { 351391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen if (argc != 3) { 361391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen std::cerr << "usage: relayserver internal-address external-address" 371391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen << std::endl; 381391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 1; 391391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen } 401391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 411391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen talk_base::SocketAddress int_addr; 421391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen if (!int_addr.FromString(argv[1])) { 431391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen std::cerr << "Unable to parse IP address: " << argv[1]; 441391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 1; 451391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen } 461391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 471391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen talk_base::SocketAddress ext_addr; 481391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen if (!ext_addr.FromString(argv[2])) { 491391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen std::cerr << "Unable to parse IP address: " << argv[2]; 501391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 1; 511391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen } 521391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 531391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen talk_base::Thread *pthMain = talk_base::Thread::Current(); 541391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 551391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen talk_base::scoped_ptr<talk_base::AsyncUDPSocket> int_socket( 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen talk_base::AsyncUDPSocket::Create(pthMain->socketserver(), int_addr)); 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!int_socket.get()) { 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::cerr << "Failed to create a UDP socket bound at" 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen << int_addr.ToString() << std::endl; 601391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 1; 611391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen } 621391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 631391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen talk_base::scoped_ptr<talk_base::AsyncUDPSocket> ext_socket( 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen talk_base::AsyncUDPSocket::Create(pthMain->socketserver(), ext_addr)); 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (ext_socket.get()) { 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::cerr << "Failed to create a UDP socket bound at" 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen << ext_addr.ToString() << std::endl; 681391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 1; 691391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen } 701391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 711391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen cricket::RelayServer server(pthMain); 721391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen server.AddInternalSocket(int_socket.get()); 731391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen server.AddExternalSocket(ext_socket.get()); 741391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 751391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen std::cout << "Listening internally at " << int_addr.ToString() << std::endl; 761391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen std::cout << "Listening externally at " << ext_addr.ToString() << std::endl; 771391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen 781391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen pthMain->Run(); 791391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen return 0; 801391b24619d56bae6ce14bb54ed0fb16a945e853Kristian Monsen} 81