P2P内网服务器的伪代码解释
来源:互联网 发布:linux dd命令拷贝分区 编辑:程序博客网 时间:2024/04/29 19:06
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;
阅读全文
0 0
- P2P内网服务器的伪代码解释
- p2p伪代码
- UDP内网穿透讲解及代码实现、P2P
- arm数据移动操作的解释,伪代码
- P2P内网穿透原理
- P2P内网穿透原理
- P2P内网穿透原理
- 反编译内部类代码解释
- ftp服务器连接伪代码
- P2P原理的解释与实现
- P2P原理的解释与实现
- P2P原理的解释与实现
- P2P原理的解释与实现
- 局域网内配置服务器方法--p2p技术、端口映射、网络域名
- Apache服务器网站访问伪静态内页出现No input file specified.的完美解决方案
- For yahoo(p2p 内网穿透)
- P2P内网穿透原理-UDP
- P2P内网穿透原理-tcp
- vue开发:VUE axios发送跨域请求需要注意的问题
- seekbar去掉thumb(小圆球)
- 线程类中不能使用@Autowired注解
- 设计模式之孪生兄弟
- MongoDB:12-MongoDB 数据库引用(DBRefs vs 手动引用)
- P2P内网服务器的伪代码解释
- linux体系架构
- 一道面试题目引发的思考
- ps -ef | grep tomcat 命令详解
- 【入门篇】Elasticsearch、Kibana权限控制
- itext实现图片等比缩小放大转pdf
- 基于HyperLedger 创建第一个区块链网络
- Java面试题全集(中)
- 面向接口编程