int fd_socket;
int fd_connect;
int fd_server;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
//创建可重复使用socket
fd_socket= socket(AF_INET, SOCK_STREAM, 0);
if(fd_socket < 0)
{
printf("Init socket failed!\n");
return -1;
}
int iOption_value = 1;
int iLength = sizeof(int);
if(setsockopt(fd_socket,SOL_SOCKET,SO_REUSEADDR,&iOption_value, iLength)<0)
{
printf("setsockopt error\n");
return -1;
}
// 使用该socket绑定client addr 绑定端口6666
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(6666);
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fd_socket,(struct sockaddr *)&client_addr, sizeof(client_addr)) < 0)
{
perror("bind");
return -1;
}
// 使用socket绑定 serv sock 连接 SERVER S
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(1234);
serv_addr.sin_addr.s_addr = inet_addr("10.10.10.66");
if(connect(fd_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("connect error\n");
return -1;
}
// 获得这个sock作为client的信息。
memset(&client_addr, 0, sizeof(client_addr));
int iAddrLen = sizeof(client_addr);
if(getsockname(fd_socket, (struct sockaddr *)&client_addr, &iAddrLen) < 0)
{
printf("getsockname\n");
return -1;
}
// 打印出 client addr 绑定的端口 (可能是6666?)
printf("the port is %d\n", htons(client_addr.sin_port));
fd_server = socket(AF_INET, SOCK_STREAM, 0);
if(fd_server < 0)
{
printf("Init socket failed!\n");
return -1;
}
// 将上一次TCP连接获取的client Port作为NAT的Server端的Port绑定到fd_server中,fd_server用来对外提供P2P服务
if(setsockopt(fd_server,SOL_SOCKET,SO_REUSEADDR,&iOption_value, iLength)<0)
{
printf("setsockopt error\n");
return -1;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = client_addr.sin_port;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fd_server,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("bind");
return -1;
}
// 开始监听外网请求
if(listen(fd_server, 12) < 0)
{
perror("listen");
}
printf("listen success\n");
sleep(20);
return 0;
int fd_connect;
int fd_server;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
//创建可重复使用socket
fd_socket= socket(AF_INET, SOCK_STREAM, 0);
if(fd_socket < 0)
{
printf("Init socket failed!\n");
return -1;
}
int iOption_value = 1;
int iLength = sizeof(int);
if(setsockopt(fd_socket,SOL_SOCKET,SO_REUSEADDR,&iOption_value, iLength)<0)
{
printf("setsockopt error\n");
return -1;
}
// 使用该socket绑定client addr 绑定端口6666
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(6666);
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fd_socket,(struct sockaddr *)&client_addr, sizeof(client_addr)) < 0)
{
perror("bind");
return -1;
}
// 使用socket绑定 serv sock 连接 SERVER S
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(1234);
serv_addr.sin_addr.s_addr = inet_addr("10.10.10.66");
if(connect(fd_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("connect error\n");
return -1;
}
// 获得这个sock作为client的信息。
memset(&client_addr, 0, sizeof(client_addr));
int iAddrLen = sizeof(client_addr);
if(getsockname(fd_socket, (struct sockaddr *)&client_addr, &iAddrLen) < 0)
{
printf("getsockname\n");
return -1;
}
// 打印出 client addr 绑定的端口 (可能是6666?)
printf("the port is %d\n", htons(client_addr.sin_port));
fd_server = socket(AF_INET, SOCK_STREAM, 0);
if(fd_server < 0)
{
printf("Init socket failed!\n");
return -1;
}
// 将上一次TCP连接获取的client Port作为NAT的Server端的Port绑定到fd_server中,fd_server用来对外提供P2P服务
if(setsockopt(fd_server,SOL_SOCKET,SO_REUSEADDR,&iOption_value, iLength)<0)
{
printf("setsockopt error\n");
return -1;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = client_addr.sin_port;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fd_server,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("bind");
return -1;
}
// 开始监听外网请求
if(listen(fd_server, 12) < 0)
{
perror("listen");
}
printf("listen success\n");
sleep(20);
return 0;