Commit f16627e1 authored by Fong's avatar Fong
Browse files

fix endianness of in_addr

parent 62b2ef30
...@@ -3,6 +3,7 @@ CFLAGS = -g -Wall ...@@ -3,6 +3,7 @@ CFLAGS = -g -Wall
all: nat_traversal 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 nat_traversal: main.o nat_traversal.o nat_type.o
$(CC) $(CFLAGS) -o nat_traversal main.o nat_traversal.o nat_type.o -pthread $(CC) $(CFLAGS) -o nat_traversal main.o nat_traversal.o nat_type.o -pthread
......
...@@ -12,13 +12,16 @@ ...@@ -12,13 +12,16 @@
#define DEFAULT_SERVER_PORT 9988 #define DEFAULT_SERVER_PORT 9988
#define MSG_BUF_SIZE 512 #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[] = { static char *stun_servers[] = {
"stun.ideasip.com", "stun.ideasip.com",
"stun.ekiga.net", "stun.ekiga.net",
"203.183.172.196" "203.183.172.196"
}; };
// definition checked against extern declaration
int verbose = 0;
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
char* stun_server = stun_servers[0]; char* stun_server = stun_servers[0];
...@@ -28,7 +31,7 @@ int main(int argc, char** argv) ...@@ -28,7 +31,7 @@ int main(int argc, char** argv)
char* punch_server = NULL; char* punch_server = NULL;
uint32_t peer_id = 0; 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; int opt;
while ((opt = getopt (argc, argv, "H:h:P:p:s:d:i")) != -1) while ((opt = getopt (argc, argv, "H:h:P:p:s:d:i")) != -1)
{ {
...@@ -55,6 +58,8 @@ int main(int argc, char** argv) ...@@ -55,6 +58,8 @@ int main(int argc, char** argv)
case 'i': case 'i':
local_host = optarg; local_host = optarg;
break; break;
case 'v':
verbose = 1;
case '?': case '?':
default: default:
printf("invalid option: %c\n", opt); printf("invalid option: %c\n", opt);
...@@ -67,9 +72,9 @@ int main(int argc, char** argv) ...@@ -67,9 +72,9 @@ int main(int argc, char** argv)
char ext_ip[16] = {0}; char ext_ip[16] = {0};
uint16_t ext_port = 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); 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)); printf("NAT type: %s\n", get_nat_desc(type));
if (ext_port) { if (ext_port) {
printf("external address: %s:%d\n", ext_ip, ext_port); printf("external address: %s:%d\n", ext_ip, ext_port);
...@@ -89,10 +94,6 @@ int main(int argc, char** argv) ...@@ -89,10 +94,6 @@ int main(int argc, char** argv)
server_addr.sin_port = htons(DEFAULT_SERVER_PORT); server_addr.sin_port = htons(DEFAULT_SERVER_PORT);
client c; client c;
// test
c.type = SymmetricNAT;
if (init(self, server_addr, &c)) { if (init(self, server_addr, &c)) {
printf("init failed\n"); printf("init failed\n");
...@@ -100,8 +101,9 @@ int main(int argc, char** argv) ...@@ -100,8 +101,9 @@ int main(int argc, char** argv)
} }
if (peer_id) { if (peer_id) {
printf("connecting to peer %d", peer_id);
if (connect_to_peer(&c, peer_id) < 0) { 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; return -1;
} }
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "nat_type.h" #include "nat_type.h"
#define MAX_RETRIES_NUM 3
static const char* nat_types[] = { static const char* nat_types[] = {
"blocked", "blocked",
"open internet", "open internet",
...@@ -125,7 +127,10 @@ static int send_bind_request(int sock, const char* remote_host, uint16_t remote_ ...@@ -125,7 +127,10 @@ 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); memcpy(&remote_addr.sin_addr.s_addr, server->h_addr_list[0], server->h_length);
remote_addr.sin_port = htons(remote_port); remote_addr.sin_port = htons(remote_port);
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))) { if (-1 == sendto(sock, buf, ptr - buf, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr))) {
// udp sendto barely failed
free(buf); free(buf);
return -1; return -1;
...@@ -134,15 +139,25 @@ static int send_bind_request(int sock, const char* remote_host, uint16_t remote_ ...@@ -134,15 +139,25 @@ static int send_bind_request(int sock, const char* remote_host, uint16_t remote_
socklen_t fromlen = sizeof remote_addr; socklen_t fromlen = sizeof remote_addr;
struct timeval tv; struct timeval tv;
tv.tv_sec = 5; tv.tv_sec = 3;
tv.tv_usec = 0; tv.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv)); setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv));
if (recvfrom(sock, buf, 512, 0, (struct sockaddr *)&remote_addr, &fromlen) <= 0) { if (recvfrom(sock, buf, 512, 0, (struct sockaddr *)&remote_addr, &fromlen) <= 0) {
if (errno != EAGAIN || errno != EWOULDBLOCK) {
free(buf); free(buf);
return -1; return -1;
} }
//timout, retry
} else {
// got response
break;
}
}
if (retries == MAX_RETRIES_NUM)
return -1;
StunHeader reply_header; StunHeader reply_header;
memcpy(&reply_header, buf, sizeof(StunHeader)); 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* ...@@ -278,7 +293,7 @@ nat_type detect_nat_type(const char* stun_host, uint16_t stun_port, const char*
} else { } else {
if (changed_ip != 0 && changed_port != 0) { if (changed_ip != 0 && changed_port != 0) {
if (send_bind_request(s, stun_host, stun_port, ChangeIpFlag, ChangePortFlag, bind_result)) { 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); char* alt_host = inet_ntoa(addr);
memset(bind_result, 0, sizeof(StunAtrAddress) * 2); memset(bind_result, 0, sizeof(StunAtrAddress) * 2);
......
...@@ -76,6 +76,12 @@ typedef struct ...@@ -76,6 +76,12 @@ typedef struct
char* encode16(char* buf, uint16_t data); char* encode16(char* buf, uint16_t data);
char* encode32(char* buf, uint32_t data); char* encode32(char* buf, uint32_t data);
char* encode(char* buf, const char* data, unsigned int length); 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); 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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment