亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? relayserver.cxx

?? 由GOOGLE的JINGLE項目中移植的網絡庫
?? CXX
?? 第 1 頁 / 共 2 頁
字號:
/* * libjingle * Copyright 2004--2005, Google Inc. * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met: * *  1. Redistributions of source code must retain the above copyright notice,  *     this list of conditions and the following disclaimer. *  2. Redistributions in binary form must reproduce the above copyright notice, *     this list of conditions and the following disclaimer in the documentation *     and/or other materials provided with the distribution. *  3. The name of the author may not be used to endorse or promote products  *     derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
#if defined(_MSC_VER) && _MSC_VER < 1300
#pragma warning(disable:4786)
#endif
#include "relayserver.h"#include "helpers.h"#include <algorithm>#include <cassert>#include <cstring>namespace cricket {// By default, we require a ping every 90 seconds.const int MAX_LIFETIME = 15 * 60 * 1000;// The number of bytes in each of the usernames we use.const uint32 USERNAME_LENGTH = 16;// Calls SendTo on the given socket and logs any bad results.void Send(AsyncPacketSocket* socket, const char* bytes, size_t size,          const SocketAddress& addr) {  int result = socket->SendTo(bytes, size, addr);  if (result < int(size)) {    /// std::cerr << "SendTo wrote only " << result << " of " << int(size)      ///        << " bytes" << std::endl;  } else if (result < 0) {    /// std::cerr << "SendTo: " << std::strerror(errno) << std::endl;  }}// Sends the given STUN message on the given socket.void SendStun(const StunMessage& msg,              AsyncPacketSocket* socket,              const SocketAddress& addr) {  ByteBuffer buf;  msg.Write(&buf);  Send(socket, buf.Data(), buf.Length(), addr);}// Constructs a STUN error response and sends it on the given socket.void SendStunError(const StunMessage& msg, AsyncPacketSocket* socket,                   const SocketAddress& remote_addr, int error_code,                   const char* error_desc, const std::string& magic_cookie) {  StunMessage err_msg;  err_msg.SetType(GetStunErrorResponseType(msg.type()));  err_msg.SetTransactionID(msg.transaction_id());  StunByteStringAttribute* magic_cookie_attr =      StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE);  if (magic_cookie.size() == 0)    magic_cookie_attr->CopyBytes(cricket::STUN_MAGIC_COOKIE_VALUE, 4);  else    magic_cookie_attr->CopyBytes(magic_cookie.c_str(), magic_cookie.size());  err_msg.AddAttribute(magic_cookie_attr);  StunErrorCodeAttribute* err_code = StunAttribute::CreateErrorCode();  err_code->SetErrorClass(error_code / 100);  err_code->SetNumber(error_code % 100);  err_code->SetReason(error_desc);  err_msg.AddAttribute(err_code);  SendStun(err_msg, socket, remote_addr);}RelayServer::RelayServer(Thread* thread) : thread_(thread) {}RelayServer::~RelayServer() {
	unsigned i;  for (i = 0; i < internal_sockets_.size(); i++)    delete internal_sockets_[i];  for (i = 0; i < external_sockets_.size(); i++)    delete external_sockets_[i];}void RelayServer::AddInternalSocket(AsyncPacketSocket* socket) {  assert(internal_sockets_.end() ==      std::find(internal_sockets_.begin(), internal_sockets_.end(), socket));  internal_sockets_.push_back(socket);  socket->SignalReadPacket.connect(this, &RelayServer::OnInternalPacket);}void RelayServer::RemoveInternalSocket(AsyncPacketSocket* socket) {  SocketList::iterator iter =      std::find(internal_sockets_.begin(), internal_sockets_.end(), socket);  assert(iter != internal_sockets_.end());  internal_sockets_.erase(iter);  socket->SignalReadPacket.disconnect(this);}void RelayServer::AddExternalSocket(AsyncPacketSocket* socket) {  assert(external_sockets_.end() ==      std::find(external_sockets_.begin(), external_sockets_.end(), socket));  external_sockets_.push_back(socket);  socket->SignalReadPacket.connect(this, &RelayServer::OnExternalPacket);}void RelayServer::RemoveExternalSocket(AsyncPacketSocket* socket) {  SocketList::iterator iter =      std::find(external_sockets_.begin(), external_sockets_.end(), socket);  assert(iter != external_sockets_.end());  external_sockets_.erase(iter);  socket->SignalReadPacket.disconnect(this);}void RelayServer::OnInternalPacket(    const char* bytes, size_t size, const SocketAddress& remote_addr,    AsyncPacketSocket* socket) {  // Get the address of the connection we just received on.  SocketAddressPair ap(remote_addr, socket->GetLocalAddress());  assert(!ap.destination().IsAny());  // If this did not come from an existing connection, it should be a STUN  // allocate request.  ConnectionMap::iterator piter = connections_.find(ap);  if (piter == connections_.end()) {    HandleStunAllocate(bytes, size, ap, socket);    return;  }  RelayServerConnection* int_conn = piter->second;  // Handle STUN requests to the server itself.  if (int_conn->binding()->HasMagicCookie(bytes, size)) {    HandleStun(int_conn, bytes, size);    return;  }  // Otherwise, this is a non-wrapped packet that we are to forward.  Make sure  // that this connection has been locked.  (Otherwise, we would not know what  // address to forward to.)  if (!int_conn->locked()) {///    std::cerr << "Dropping packet: connection not locked" << std::endl;    return;  }  // Forward this to the destination address into the connection.  RelayServerConnection* ext_conn = int_conn->binding()->GetExternalConnection(      int_conn->default_destination());  if (ext_conn) {    // TODO: Check the HMAC.    ext_conn->Send(bytes, size);  } else {    // This happens very often and is not an error.    //std::cerr << "Dropping packet: no external connection" << std::endl;  }}void RelayServer::OnExternalPacket(    const char* bytes, size_t size, const SocketAddress& remote_addr,    AsyncPacketSocket* socket) {  // Get the address of the connection we just received on.  SocketAddressPair ap(remote_addr, socket->GetLocalAddress());  assert(!ap.destination().IsAny());  // If this connection already exists, then forward the traffic.  ConnectionMap::iterator piter = connections_.find(ap);  if (piter != connections_.end()) {    // TODO: Check the HMAC.    RelayServerConnection* ext_conn = piter->second;    RelayServerConnection* int_conn =        ext_conn->binding()->GetInternalConnection(            ext_conn->addr_pair().source());    assert(int_conn);    int_conn->Send(bytes, size, ext_conn->addr_pair().source());    return;  }  // The first packet should always be a STUN / TURN packet.  If it isn't, then  // we should just ignore this packet.  StunMessage msg;  ByteBuffer buf = ByteBuffer(bytes, size);  if (!msg.Read(&buf)) {///    std::cerr << "Dropping packet: first packet not STUN" << std::endl;    return;  }  // The initial packet should have a username (which identifies the binding).  const StunByteStringAttribute* username_attr =      msg.GetByteString(STUN_ATTR_USERNAME);  if (!username_attr) {///    std::cerr << "Dropping packet: no username" << std::endl;    return;  }  uint32 length = _min(uint32(username_attr->length()), USERNAME_LENGTH);  std::string username(username_attr->bytes(), length);  // TODO: Check the HMAC.  // The binding should already be present.  BindingMap::iterator biter = bindings_.find(username);  if (biter == bindings_.end()) {    // TODO: Turn this back on.  This is the sign of a client bug.    //std::cerr << "Dropping packet: no binding with username" << std::endl;    return;  }  // Add this authenticted connection to the binding.  RelayServerConnection* ext_conn =      new RelayServerConnection(biter->second, ap, socket);  ext_conn->binding()->AddExternalConnection(ext_conn);  AddConnection(ext_conn);  // We always know where external packets should be forwarded, so we can lock  // them from the beginning.  ext_conn->Lock();  // Send this message on the appropriate internal connection.  RelayServerConnection* int_conn = ext_conn->binding()->GetInternalConnection(      ext_conn->addr_pair().source());  assert(int_conn);  int_conn->Send(bytes, size, ext_conn->addr_pair().source());}bool RelayServer::HandleStun(    const char* bytes, size_t size, const SocketAddress& remote_addr,    AsyncPacketSocket* socket, std::string* username, StunMessage* msg) {  // Parse this into a stun message.  ByteBuffer buf = ByteBuffer(bytes, size);  if (!msg->Read(&buf)) {    SendStunError(*msg, socket, remote_addr, 400, "Bad Request", "");    return false;  }  // The initial packet should have a username (which identifies the binding).  const StunByteStringAttribute* username_attr =      msg->GetByteString(STUN_ATTR_USERNAME);  if (!username_attr) {    SendStunError(*msg, socket, remote_addr, 432, "Missing Username", "");    return false;  }  // Record the username if requested.  if (username)    username->append(username_attr->bytes(), username_attr->length());  // TODO: Check for unknown attributes (<= 0x7fff)  return true;}void RelayServer::HandleStunAllocate(    const char* bytes, size_t size, const SocketAddressPair& ap,    AsyncPacketSocket* socket) {  // Make sure this is a valid STUN request.  StunMessage request;  std::string username;  if (!HandleStun(bytes, size, ap.source(), socket, &username, &request))    return;  // Make sure this is a an allocate request.  if (request.type() != STUN_ALLOCATE_REQUEST) {    SendStunError(request,                  socket,                  ap.source(),                  600,                  "Operation Not Supported",                  "");    return;  }  // TODO: Check the HMAC.  // Find or create the binding for this username.  RelayServerBinding* binding;  BindingMap::iterator biter = bindings_.find(username);  if (biter != bindings_.end()) {    binding = biter->second;  } else {    // NOTE: In the future, bindings will be created by the bot only.  This    //       else-branch will then disappear.    // Compute the appropriate lifetime for this binding.    uint32 lifetime = MAX_LIFETIME;    const StunUInt32Attribute* lifetime_attr =        request.GetUInt32(STUN_ATTR_LIFETIME);    if (lifetime_attr)      lifetime = _min(lifetime, lifetime_attr->value() * 1000);    binding = new RelayServerBinding(this, username, "0", lifetime);    binding->SignalTimeout.connect(this, &RelayServer::OnTimeout);    bindings_[username] = binding;///    std::cout << "Added new binding: " << bindings_.size() << " total" << std::endl;  }  // Add this connection to the binding.  It starts out unlocked.  RelayServerConnection* int_conn =      new RelayServerConnection(binding, ap, socket);  binding->AddInternalConnection(int_conn);  AddConnection(int_conn);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美国毛片一区二区| 97久久超碰精品国产| 欧美高清视频一二三区| 欧美激情一区二区三区全黄| 欧美a级一区二区| 91精品在线观看入口| 一区二区三区视频在线观看| 国产乱国产乱300精品| 日韩视频一区二区三区在线播放 | 日韩电影在线观看一区| 成人精品免费网站| 久久久久久**毛片大全| 久久福利视频一区二区| 日韩亚洲电影在线| 三级欧美韩日大片在线看| 91免费版在线| 亚洲自拍偷拍网站| 日本精品一级二级| 亚洲激情欧美激情| 欧洲日韩一区二区三区| 一区二区三区欧美亚洲| 99精品久久久久久| 国产精品国产自产拍高清av| 国产成人亚洲综合a∨婷婷 | 亚洲精品日韩专区silk| 99久久综合色| 国产精品久久久久久久久果冻传媒 | 国产亚洲一区字幕| 国产真实精品久久二三区| 日韩欧美在线影院| 麻豆精品精品国产自在97香蕉| 日韩欧美一区中文| 黑人巨大精品欧美一区| 久久久欧美精品sm网站| 丰满岳乱妇一区二区三区| 中文字幕在线视频一区| 肉色丝袜一区二区| 欧美日本一道本在线视频| 午夜视黄欧洲亚洲| 久久中文字幕电影| 不卡一区二区在线| 97精品国产露脸对白| 亚洲精选免费视频| 欧美一卡二卡三卡四卡| 丁香六月综合激情| 亚洲大片一区二区三区| 久久久久久久久蜜桃| 一本到不卡免费一区二区| 日韩国产精品久久久久久亚洲| 久久久久久久免费视频了| 日日噜噜夜夜狠狠视频欧美人| 久久久久久久久久久久电影| 91福利视频网站| 成人免费视频视频| 欧美在线综合视频| 国产制服丝袜一区| 婷婷久久综合九色综合伊人色| 久久久三级国产网站| 欧美精品日韩精品| 91视视频在线直接观看在线看网页在线看| 日本亚洲视频在线| 日韩欧美色综合网站| 欧美日韩精品一区二区三区蜜桃| 99久久精品一区| 国产精品1区2区3区在线观看| 午夜精品视频一区| 一区二区三区在线看| 国产精品久久久久久久久免费桃花| 欧美变态tickle挠乳网站| 91精品国产黑色紧身裤美女| 欧美体内she精高潮| 一本色道久久综合亚洲精品按摩| 国产成人一级电影| 国产精品一区二区久激情瑜伽| 三级久久三级久久久| 男人的j进女人的j一区| 国产一区二区在线观看免费| 一个色综合av| 国产综合久久久久影院| 一本大道av一区二区在线播放| 4hu四虎永久在线影院成人| 亚洲国产sm捆绑调教视频 | 久久av资源网| 色婷婷av一区二区三区gif| 精品国产凹凸成av人导航| 一区二区在线看| 国产成人小视频| 日韩丝袜情趣美女图片| 亚洲精品日日夜夜| 亚洲影视资源网| 亚洲va欧美va人人爽午夜 | 亚洲一区二区成人在线观看| 午夜a成v人精品| 岛国av在线一区| 欧美色图在线观看| 亚洲精品一线二线三线| 亚洲女同ⅹxx女同tv| 琪琪一区二区三区| 亚洲精选免费视频| 午夜影院久久久| 国产成人无遮挡在线视频| 日韩综合在线视频| av一区二区三区| 日韩欧美一区二区不卡| 亚洲欧美影音先锋| 狠狠狠色丁香婷婷综合激情 | 最新热久久免费视频| 看电影不卡的网站| 在线观看av一区二区| 久久一区二区三区四区| 亚洲大片免费看| 国产.欧美.日韩| 久久午夜电影网| 日本在线不卡视频一二三区| 欧美久久一二区| 国产欧美精品区一区二区三区 | 亚洲日本va在线观看| 国产精品欧美一区喷水| 亚洲电影中文字幕在线观看| 成人精品免费网站| 欧美精品一区二区久久久| 亚洲另类色综合网站| 成人一区二区三区视频在线观看 | 精品人在线二区三区| 午夜电影一区二区三区| 色88888久久久久久影院野外| 国产喷白浆一区二区三区| 国产一区二区在线免费观看| 91精品国产综合久久婷婷香蕉| 一区二区在线电影| 色欧美片视频在线观看| 亚洲欧美日韩在线| 91麻豆高清视频| 亚洲自拍欧美精品| 欧美日韩中字一区| 日韩电影在线免费观看| 欧美一级在线视频| 韩国视频一区二区| 久久亚区不卡日本| 国产高清视频一区| 国产精品色哟哟| 色婷婷国产精品| 日本中文在线一区| 精品电影一区二区| 国产**成人网毛片九色| 亚洲欧美中日韩| 欧美日韩一区二区三区不卡 | 色婷婷av一区二区三区软件| 欧美剧情片在线观看| 韩国欧美一区二区| 国产精品国产精品国产专区不片| 在线视频你懂得一区二区三区| 日韩一区二区精品在线观看| 国产精品一卡二| 亚洲精品一二三| 日韩一级视频免费观看在线| 国产毛片精品视频| 亚洲精品久久久蜜桃| 欧美精品一区二区蜜臀亚洲| 91在线视频免费观看| 免费观看在线综合| 国产精品全国免费观看高清| 欧美日韩国产不卡| 国产精品99久久不卡二区| 午夜视频一区二区| 色偷偷久久一区二区三区| 精品亚洲porn| 亚洲精品菠萝久久久久久久| 久久这里只有精品6| 欧美疯狂性受xxxxx喷水图片| 福利一区二区在线| 亚洲欧美日韩国产另类专区| 日韩午夜精品电影| 69堂精品视频| 免费观看久久久4p| 亚洲高清一区二区三区| 国产精品欧美一区喷水| 精品99一区二区三区| 欧美日韩精品福利| 欧美在线免费视屏| 99国产精品视频免费观看| 国产高清久久久| 韩国一区二区三区| 国产精品女同互慰在线看| 久久亚洲影视婷婷| 日韩一区国产二区欧美三区| 欧美午夜精品久久久久久超碰 | 日韩欧美一区二区视频| 91精品国产综合久久精品| 午夜成人免费视频| 日本怡春院一区二区| 日韩精品成人一区二区在线| 亚洲成av人在线观看| 亚洲午夜激情av| 午夜精品福利在线| 欧美a一区二区| 国产一区二区三区不卡在线观看| 老司机精品视频在线| 国产在线麻豆精品观看| 亚洲欧洲精品一区二区精品久久久 |