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