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
f16627e1
Commit
f16627e1
authored
May 16, 2017
by
Fong
Browse files
fix endianness of in_addr
parent
62b2ef30
Changes
4
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
f16627e1
...
...
@@ -3,6 +3,7 @@ CFLAGS = -g -Wall
all
:
nat_traversal
# clang warn about unused argument, it requires -pthread when compiling but not when linking
nat_traversal
:
main.o nat_traversal.o nat_type.o
$(CC)
$(CFLAGS)
-o
nat_traversal main.o nat_traversal.o nat_type.o
-pthread
...
...
main.c
View file @
f16627e1
...
...
@@ -12,13 +12,16 @@
#define DEFAULT_SERVER_PORT 9988
#define MSG_BUF_SIZE 512
// use
some
public stun servers to detect port allocation rule
// use public stun servers to detect port allocation rule
static
char
*
stun_servers
[]
=
{
"stun.ideasip.com"
,
"stun.ekiga.net"
,
"203.183.172.196"
};
// definition checked against extern declaration
int
verbose
=
0
;
int
main
(
int
argc
,
char
**
argv
)
{
char
*
stun_server
=
stun_servers
[
0
];
...
...
@@ -28,7 +31,7 @@ int main(int argc, char** argv)
char
*
punch_server
=
NULL
;
uint32_t
peer_id
=
0
;
static
char
usage
[]
=
"usage: [-h] [-H STUN_HOST] [-P STUN_PORT] [-s punch server] [-d id] [-i SOURCE_IP] [-p SOURCE_PORT]
\n
"
;
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
"
;
int
opt
;
while
((
opt
=
getopt
(
argc
,
argv
,
"H:h:P:p:s:d:i"
))
!=
-
1
)
{
...
...
@@ -55,6 +58,8 @@ int main(int argc, char** argv)
case
'i'
:
local_host
=
optarg
;
break
;
case
'v'
:
verbose
=
1
;
case
'?'
:
default:
printf
(
"invalid option: %c
\n
"
,
opt
);
...
...
@@ -67,9 +72,9 @@ int main(int argc, char** argv)
char
ext_ip
[
16
]
=
{
0
};
uint16_t
ext_port
=
0
;
// TODO we should try another STUN server if failed
nat_type
type
=
detect_nat_type
(
stun_server
,
stun_port
,
local_host
,
local_port
,
ext_ip
,
&
ext_port
);
// TODO log
printf
(
"NAT type: %s
\n
"
,
get_nat_desc
(
type
));
if
(
ext_port
)
{
printf
(
"external address: %s:%d
\n
"
,
ext_ip
,
ext_port
);
...
...
@@ -89,10 +94,6 @@ int main(int argc, char** argv)
server_addr
.
sin_port
=
htons
(
DEFAULT_SERVER_PORT
);
client
c
;
// test
c
.
type
=
SymmetricNAT
;
if
(
init
(
self
,
server_addr
,
&
c
))
{
printf
(
"init failed
\n
"
);
...
...
@@ -100,8 +101,9 @@ int main(int argc, char** argv)
}
if
(
peer_id
)
{
printf
(
"connecting to peer %d"
,
peer_id
);
if
(
connect_to_peer
(
&
c
,
peer_id
)
<
0
)
{
printf
(
"failed to connect
\n
"
);
printf
(
"failed to connect
to peer %d
\n
"
,
peer_id
);
return
-
1
;
}
...
...
nat_type.c
View file @
f16627e1
...
...
@@ -11,6 +11,8 @@
#include "nat_type.h"
#define MAX_RETRIES_NUM 3
static
const
char
*
nat_types
[]
=
{
"blocked"
,
"open internet"
,
...
...
@@ -125,24 +127,37 @@ static int send_bind_request(int sock, const char* remote_host, uint16_t remote_
memcpy
(
&
remote_addr
.
sin_addr
.
s_addr
,
server
->
h_addr_list
[
0
],
server
->
h_length
);
remote_addr
.
sin_port
=
htons
(
remote_port
);
if
(
-
1
==
sendto
(
sock
,
buf
,
ptr
-
buf
,
0
,
(
struct
sockaddr
*
)
&
remote_addr
,
sizeof
(
remote_addr
)))
{
free
(
buf
);
int
retries
;
for
(
retries
=
0
;
retries
<
MAX_RETRIES_NUM
;
retries
++
)
{
if
(
-
1
==
sendto
(
sock
,
buf
,
ptr
-
buf
,
0
,
(
struct
sockaddr
*
)
&
remote_addr
,
sizeof
(
remote_addr
)))
{
// udp sendto barely failed
free
(
buf
);
return
-
1
;
}
return
-
1
;
}
socklen_t
fromlen
=
sizeof
remote_addr
;
socklen_t
fromlen
=
sizeof
remote_addr
;
struct
timeval
tv
;
tv
.
tv_sec
=
5
;
tv
.
tv_usec
=
0
;
setsockopt
(
sock
,
SOL_SOCKET
,
SO_RCVTIMEO
,
(
const
char
*
)
&
tv
,
sizeof
(
tv
));
struct
timeval
tv
;
tv
.
tv_sec
=
3
;
tv
.
tv_usec
=
0
;
setsockopt
(
sock
,
SOL_SOCKET
,
SO_RCVTIMEO
,
(
const
char
*
)
&
tv
,
sizeof
(
tv
));
if
(
recvfrom
(
sock
,
buf
,
512
,
0
,
(
struct
sockaddr
*
)
&
remote_addr
,
&
fromlen
)
<=
0
)
{
free
(
buf
);
if
(
recvfrom
(
sock
,
buf
,
512
,
0
,
(
struct
sockaddr
*
)
&
remote_addr
,
&
fromlen
)
<=
0
)
{
if
(
errno
!=
EAGAIN
||
errno
!=
EWOULDBLOCK
)
{
free
(
buf
);
return
-
1
;
}
return
-
1
;
}
//timout, retry
}
else
{
// got response
break
;
}
}
if
(
retries
==
MAX_RETRIES_NUM
)
return
-
1
;
StunHeader
reply_header
;
memcpy
(
&
reply_header
,
buf
,
sizeof
(
StunHeader
));
...
...
@@ -278,7 +293,7 @@ nat_type detect_nat_type(const char* stun_host, uint16_t stun_port, const char*
}
else
{
if
(
changed_ip
!=
0
&&
changed_port
!=
0
)
{
if
(
send_bind_request
(
s
,
stun_host
,
stun_port
,
ChangeIpFlag
,
ChangePortFlag
,
bind_result
))
{
struct
in_addr
addr
=
{
changed_ip
};
struct
in_addr
addr
=
{
htonl
(
changed_ip
)
};
char
*
alt_host
=
inet_ntoa
(
addr
);
memset
(
bind_result
,
0
,
sizeof
(
StunAtrAddress
)
*
2
);
...
...
nat_type.h
View file @
f16627e1
...
...
@@ -76,6 +76,12 @@ typedef struct
char
*
encode16
(
char
*
buf
,
uint16_t
data
);
char
*
encode32
(
char
*
buf
,
uint32_t
data
);
char
*
encode
(
char
*
buf
,
const
char
*
data
,
unsigned
int
length
);
extern
int
verbose
;
#define verbose_log(format, ...) do { \
if (verbose) \
printf(format, ##__VA_ARGS__); \
} while(0)
nat_type
detect_nat_type
(
const
char
*
stun_host
,
uint16_t
stun_port
,
const
char
*
local_host
,
uint16_t
local_port
,
char
*
ext_ip
,
uint16_t
*
ext_port
);
...
...
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