Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
nat_traversal
Commits
64dab16a
Commit
64dab16a
authored
May 18, 2017
by
Fong
Browse files
fix gaint bug caused by varible scope
parent
d18fc297
Changes
3
Hide whitespace changes
Inline
Side-by-side
main.c
View file @
64dab16a
...
...
@@ -30,8 +30,9 @@ int main(int argc, char** argv)
uint16_t
local_port
=
DEFAULT_LOCAL_PORT
;
char
*
punch_server
=
NULL
;
uint32_t
peer_id
=
0
;
int
ttl
=
10
;
static
char
usage
[]
=
"usage: [-h] [-H STUN_HOST] [-P STUN_PORT] [-s punch server] [-d id] [-i SOURCE_IP] [-p SOURCE_PORT] [-v verbose]
\n
"
;
static
char
usage
[]
=
"usage: [-h] [-H STUN_HOST]
[-t ttl]
[-P STUN_PORT] [-s punch server] [-d id] [-i SOURCE_IP] [-p SOURCE_PORT] [-v verbose]
\n
"
;
int
opt
;
while
((
opt
=
getopt
(
argc
,
argv
,
"H:h:P:p:s:d:i"
))
!=
-
1
)
{
...
...
@@ -43,6 +44,9 @@ int main(int argc, char** argv)
case
'H'
:
stun_server
=
optarg
;
break
;
case
't'
:
ttl
=
atoi
(
optarg
);
break
;
case
'P'
:
stun_port
=
atoi
(
optarg
);
break
;
...
...
@@ -98,6 +102,7 @@ int main(int argc, char** argv)
client
c
;
c
.
type
=
type
;
c
.
ttl
=
ttl
;
if
(
enroll
(
self
,
server_addr
,
&
c
)
<
0
)
{
printf
(
"failed to enroll
\n
"
);
...
...
@@ -105,7 +110,7 @@ int main(int argc, char** argv)
}
printf
(
"enroll successfully, ID: %d
\n
"
,
c
.
id
);
pthread_t
tid
=
wait_for_command
(
c
.
sfd
);
pthread_t
tid
=
wait_for_command
(
&
c
.
sfd
);
if
(
peer_id
)
{
printf
(
"connecting to peer %d
\n
"
,
peer_id
);
...
...
nat_traversal.c
View file @
64dab16a
...
...
@@ -36,15 +36,18 @@ static int get_peer_info(client* cli, uint32_t peer_id, struct peer_info *peer)
return
-
1
;
}
if
(
recv
(
cli
->
sfd
,
(
void
*
)
peer
,
sizeof
(
struct
peer_info
),
0
)
<
0
)
int
n_bytes
=
recv
(
cli
->
sfd
,
(
void
*
)
peer
,
sizeof
(
struct
peer_info
),
0
);
if
(
n_bytes
<=
0
)
{
return
-
1
;
}
else
if
(
n_bytes
==
1
)
{
// offline
return
1
;
}
else
{
peer
->
port
=
ntohs
(
peer
->
port
);
peer
->
type
=
ntohs
(
peer
->
type
);
peer
->
port
=
ntohs
(
peer
->
port
);
peer
->
type
=
ntohs
(
peer
->
type
);
printf
(
"peer %d: %s:%d, nat type: %s
\n
"
,
peer_id
,
peer
->
ip
,
peer
->
port
,
get_nat_desc
(
peer
->
type
));
return
0
;
return
0
;
}
}
static
int
send_dummy_udp_packet
(
int
fd
,
struct
sockaddr_in
addr
)
{
...
...
@@ -57,7 +60,7 @@ static int send_dummy_udp_packet(int fd, struct sockaddr_in addr) {
}
static
int
punch_hole
(
struct
sockaddr_in
peer_addr
)
{
static
int
punch_hole
(
struct
sockaddr_in
peer_addr
,
int
ttl
)
{
int
hole
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
if
(
hole
!=
-
1
)
{
...
...
@@ -76,7 +79,6 @@ static int punch_hole(struct sockaddr_in peer_addr) {
/* TODO we can use traceroute to get the number of hops to the peer
* to make sure this packet woudn't reach the peer but get through the NAT of itself
*/
int
ttl
=
5
;
setsockopt
(
hole
,
IPPROTO_IP
,
IP_TTL
,
&
ttl
,
sizeof
(
ttl
));
// send short ttl packets to avoid triggering flooding protection of NAT in front of peer
...
...
@@ -174,9 +176,9 @@ static int connect_to_symmetric_nat(client* c, uint32_t peer_id, struct peer_inf
if
(
port
!=
remote_peer
.
port
)
{
// exclude the used one
peer_addr
.
sin_port
=
htons
(
port
);
if
((
holes
[
i
]
=
punch_hole
(
peer_addr
))
<
0
)
{
if
((
holes
[
i
]
=
punch_hole
(
peer_addr
,
c
->
ttl
))
<
0
)
{
// NAT in front of us wound't tolerate too many ports used by one application
verbose_log
(
"NAT flooding protection triggered, try %d times
\n
"
,
i
);
verbose_log
(
"
%s,
NAT flooding protection triggered, try %d times
\n
"
,
strerror
(
errno
),
i
);
break
;
}
...
...
@@ -327,11 +329,11 @@ int enroll(struct peer_info self, struct sockaddr_in punch_server, client* c) {
return
0
;
}
pthread_t
wait_for_command
(
int
server_sock
)
pthread_t
wait_for_command
(
int
*
server_sock
)
{
// wait for command from punch server in another thread
pthread_t
thread_id
;
pthread_create
(
&
thread_id
,
NULL
,
server_notify_handler
,
(
void
*
)
&
server_sock
);
pthread_create
(
&
thread_id
,
NULL
,
server_notify_handler
,
(
void
*
)
server_sock
);
return
thread_id
;
}
...
...
@@ -353,12 +355,16 @@ void on_connected(int sock) {
int
connect_to_peer
(
client
*
cli
,
uint32_t
peer_id
)
{
struct
peer_info
peer
;
if
(
get_peer_info
(
cli
,
peer_id
,
&
peer
)
<
0
)
{
printf
(
"peer %d offline
\n
"
,
peer_id
);
int
n
=
get_peer_info
(
cli
,
peer_id
,
&
peer
);
if
(
n
)
{
verbose_log
(
"get_peer_info() return %d
\n
"
,
n
);
printf
(
"failed to get info of remote peer
\n
"
);
return
-
1
;
}
printf
(
"peer %d: %s:%d, nat type: %s
\n
"
,
peer_id
,
peer
.
ip
,
peer
.
port
,
get_nat_desc
(
peer
.
type
));
// choose less restricted peer as initiator
switch
(
peer
.
type
)
{
case
OpenInternet
:
...
...
nat_traversal.h
View file @
64dab16a
...
...
@@ -7,10 +7,16 @@ struct client {
int
sfd
;
uint32_t
id
;
char
buf
[
128
];
//use a stack-based buffer to prevent memory allocation every time
char
*
msg_buf
;
nat_type
type
;
char
ext_ip
[
16
];
uint16_t
ext_port
;
// ttl of hole punching packets,
// it should be greater than the number of hops between host to NAT of own side
// and less than the number of hops between host to NAT of remote side,
// so that the hole punching packets just die in the way
int
ttl
;
};
struct
peer_info
{
...
...
@@ -27,6 +33,6 @@ enum msg_type {
// public functions
int
enroll
(
struct
peer_info
self
,
struct
sockaddr_in
punch_server
,
client
*
c
);
pthread_t
wait_for_command
(
int
server_sock
);
pthread_t
wait_for_command
(
int
*
server_sock
);
int
connect_to_peer
(
client
*
cli
,
uint32_t
peer_id
);
void
on_connected
(
int
sock
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment