Index: webrtc/base/natsocketfactory.cc |
diff --git a/webrtc/base/natsocketfactory.cc b/webrtc/base/natsocketfactory.cc |
index 9c6756ba988cc7217fd75c04ff5a709fef68c024..a23a7e8a773974837f6746ffaa36be8e3892427c 100644 |
--- a/webrtc/base/natsocketfactory.cc |
+++ b/webrtc/base/natsocketfactory.cc |
@@ -179,8 +179,7 @@ class NATSocket : public AsyncSocket, public sigslot::has_slots<> { |
// Decode the wire packet into the actual results. |
SocketAddress real_remote_addr; |
- size_t addrlength = |
- UnpackAddressFromNAT(buf_, result, &real_remote_addr); |
+ size_t addrlength = UnpackAddressFromNAT(buf_, result, &real_remote_addr); |
memcpy(data, buf_ + addrlength, result - addrlength); |
// Make sure this packet should be delivered before returning it. |
@@ -230,7 +229,7 @@ class NATSocket : public AsyncSocket, public sigslot::has_slots<> { |
} |
void OnConnectEvent(AsyncSocket* socket) { |
- // If we're NATed, we need to send a request with the real addr to use. |
+ // If we're NATed, we need to send a message with the real addr to use. |
ASSERT(socket == socket_); |
if (server_addr_.IsNil()) { |
connected_ = true; |
@@ -269,7 +268,7 @@ class NATSocket : public AsyncSocket, public sigslot::has_slots<> { |
// Sends the destination address to the server to tell it to connect. |
void SendConnectRequest() { |
- char buf[256]; |
+ char buf[kNATEncodedIPv6AddressSize]; |
size_t length = PackAddressForNAT(buf, ARRAY_SIZE(buf), remote_addr_); |
socket_->Send(buf, length); |
} |
@@ -279,6 +278,7 @@ class NATSocket : public AsyncSocket, public sigslot::has_slots<> { |
char code; |
socket_->Recv(&code, sizeof(code)); |
if (code == 0) { |
+ connected_ = true; |
SignalConnectEvent(this); |
} else { |
Close(); |
@@ -299,8 +299,10 @@ class NATSocket : public AsyncSocket, public sigslot::has_slots<> { |
// NATSocketFactory |
NATSocketFactory::NATSocketFactory(SocketFactory* factory, |
- const SocketAddress& nat_addr) |
- : factory_(factory), nat_addr_(nat_addr) { |
+ const SocketAddress& nat_udp_addr, |
+ const SocketAddress& nat_tcp_addr) |
+ : factory_(factory), nat_udp_addr_(nat_udp_addr), |
+ nat_tcp_addr_(nat_tcp_addr) { |
} |
Socket* NATSocketFactory::CreateSocket(int type) { |
@@ -321,7 +323,11 @@ AsyncSocket* NATSocketFactory::CreateAsyncSocket(int family, int type) { |
AsyncSocket* NATSocketFactory::CreateInternalSocket(int family, int type, |
const SocketAddress& local_addr, SocketAddress* nat_addr) { |
- *nat_addr = nat_addr_; |
+ if (type == SOCK_STREAM) { |
+ *nat_addr = nat_tcp_addr_; |
+ } else { |
+ *nat_addr = nat_udp_addr_; |
+ } |
return factory_->CreateAsyncSocket(family, type); |
} |
@@ -385,7 +391,7 @@ AsyncSocket* NATSocketServer::CreateInternalSocket(int family, int type, |
if (nat) { |
socket = nat->internal_factory()->CreateAsyncSocket(family, type); |
*nat_addr = (type == SOCK_STREAM) ? |
- nat->internal_tcp_address() : nat->internal_address(); |
+ nat->internal_tcp_address() : nat->internal_udp_address(); |
} else { |
socket = server_->CreateAsyncSocket(family, type); |
} |
@@ -403,7 +409,7 @@ NATSocketServer::Translator::Translator( |
VirtualSocketServer* internal_server = new VirtualSocketServer(server_); |
internal_server->SetMessageQueue(server_->queue()); |
internal_factory_.reset(internal_server); |
- nat_server_.reset(new NATServer(type, internal_server, int_ip, |
+ nat_server_.reset(new NATServer(type, internal_server, int_ip, int_ip, |
ext_factory, ext_ip)); |
} |