当前位置: 首页 > news >正文

珠海做网站公司搭建 wordpress 简书

珠海做网站公司,搭建 wordpress 简书,网站的域名可以更改吗,网店美工培训前言 P2P网络#xff08;Peer-to-Peer Network#xff09;是一种点对点的网络结构#xff0c;它没有中心化的服务器或者管理者#xff0c;所有节点都是平等的。在P2P网络中#xff0c;每个节点都可以既是客户端也是服务端#xff0c;这种网络结构的优点是去中心化、可扩展…前言 P2P网络Peer-to-Peer Network是一种点对点的网络结构它没有中心化的服务器或者管理者所有节点都是平等的。在P2P网络中每个节点都可以既是客户端也是服务端这种网络结构的优点是去中心化、可扩展性强、抗攻击性强等。 1:P2P网络的优点 区块链 P2P 网络的优点有 去中心化没有中心化的服务器或者管理者所有节点都是平等的。 高可用性由于没有单点故障所以整个系统非常稳定。 高安全性由于每个节点都有完整的数据副本所以即使有部分节点被攻击或者宕机整个系统依然可以正常运行。 高效性由于数据可以在多个节点之间共享和传输所以整个系统非常高效。 2:分类 根据具体应用不同可以把P2P分为以下这些类型[1] ·提供文件和其它内容共享的P2P网络例如Napster、Gnutella、eDonkey、emule、BitTorrent等 ·挖掘P2P对等计算能力和存储共享能力例如SETIhome 、Avaki、Popular Power等 ·基于P2P方式的协同处理与服务共享平台例如JXTA、Magi、Groove、.NET My Service等 ·即时通讯交流包括ICQ、OICQ、Yahoo Messenger等 ·安全的P2P通讯与信息共享例如Skype、Crowds、Onion Routing等。 3区块链中的P2P网络 作为区块链的底层传输方式P2P 技术帮助区块链成功实现了点对点的传播。比特币、以太坊等众多区块链项目都实现了属于自己的P2P网络协议根据区块链的运行特点我们可以总结出区块链客户端节点所组成p2p网络的一些需求 1.节点可以任意地加入和离开网络 2.每个节点所存储的数据(区块)在理想状态下是一致的当然光凭p2p网络不能达到数据一致性它只是提供了数据传输的逻辑通道我们还需要共识算法来配合实现数据一致性 3.在区块链网络中查找数据时不需要向整个网络广播发送请求正常情况下任意一个(或相邻几个)节点就可以提供完整的区块数据。 4直接上代码 P2P打洞 UDP 打洞更容易点网上一堆不发了 TCP SERVER #include stdio.h #include signal.h #include fcntl.h #include stdlib.h #include errno.h #include string.h #ifdef _WIN32 #include WinSock2.h #includeWs2tcpip.h #pragma comment(lib,ws2_32.lib) #else #include unistd.h #include sys/socket.h #include arpa/inet.h #endif#define MAXLINE 128 #define SERV_PORT 7119 //发生了致命错误退出程序 void error_quit(const char *str) {fprintf(stderr, %s, str);//如果设置了错误号就输入出错原因 #ifdef _WIN32if (errno ! 0) {const int errmsglen 255;char errmsg[errmsglen];strerror_s(errmsg, errmsglen, errno);fprintf(stderr, : %s, errmsg);} #elseif (errno ! 0)fprintf(stderr, : %s, strerror(errno)); #endifprintf(\n);exit(1); }int main(void) {int i, res, cur_port; #ifdef _WIN32SOCKET connfd, firstfd, listenfd;WSADATA wsaData;WORD wVersionRequested MAKEWORD(2, 2);WSAStartup(wVersionRequested, wsaData); #elseint connfd, firstfd, listenfd; #endifint count 0;char str_ip[MAXLINE]; //缓存IP地址 char cur_inf[MAXLINE]; //当前的连接信息[IPport] char first_inf[MAXLINE]; //第一个链接的信息[IPport] char buffer[MAXLINE]; //临时发送缓冲区 socklen_t clilen;struct sockaddr_in cliaddr;struct sockaddr_in servaddr;//创建用于监听TCP协议套接字 listenfd socket(AF_INET, SOCK_STREAM, 0);memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr htonl(INADDR_ANY);servaddr.sin_port htons(SERV_PORT);//把socket和socket地址结构联系起来 res bind(listenfd, (struct sockaddr *)servaddr, sizeof(servaddr));if (-1 res)error_quit(bind error);//开始监听端口 res listen(listenfd, INADDR_ANY);if (-1 res)error_quit(listen error);while (1){//接收来自客户端的连接 connfd accept(listenfd, (struct sockaddr *)cliaddr, clilen);if (-1 connfd)error_quit(accept error);inet_ntop(AF_INET, (void*)cliaddr.sin_addr, str_ip, sizeof(str_ip));count;//对于第一个链接将其的IPport存储到first_inf中 //并和它建立长链接然后向它发送字符串first if (count 1){firstfd connfd;cur_port ntohs(cliaddr.sin_port);snprintf(first_inf, MAXLINE, %s %d, str_ip, cur_port);#ifdef _WIN32strcpy_s(cur_inf, MAXLINE, first\n);send(connfd, cur_inf, strlen(cur_inf) 1, 0); #elsestrcpy(cur_inf, first\n);write(connfd, cur_inf, strlen(cur_inf) 1); #endif}//对于第二个链接将其的IPport发送给第一个链接 //将第一个链接的信息和他自身的port返回给它自己 //然后断开两个链接并重置计数器 else if (count 2){cur_port ntohs(cliaddr.sin_port);snprintf(cur_inf, MAXLINE, %s %d\n, str_ip, cur_port);snprintf(buffer, MAXLINE, %s %d\n, first_inf, cur_port);#ifdef _WIN32send(connfd, buffer, strlen(buffer) 1,0);send(firstfd, cur_inf, strlen(cur_inf) 1,0);closesocket(connfd);closesocket(firstfd); #elsewrite(connfd, buffer, strlen(buffer) 1);write(firstfd, cur_inf, strlen(cur_inf) 1);close(connfd);close(firstfd); #endifcount 0;}//如果程序运行到这里那肯定是出错了 elseerror_quit(Bad required);} #ifdef _WIN32WSACleanup(); #endifreturn 0; } /* 运行示例 第一个终端 ubuntuubuntu ~/program/tcode $ gcc server.c -o server ubuntuubuntu ~/program/tcode $ ./server [1] 4688 ubuntuubuntu ~/program/tcode $ gcc client.c -o client ubuntuubuntu ~/program/tcode $ ./client localhost Get: first ff: 127.0.0.1 38052 send message: Hello, world send message: Hello, world send message: Hello, world .................第二个终端 ubuntuubuntu ~/program/tcode $ ./client localhost Get: 127.0.0.1 38073 38074 connect error recv message: Hello, world recv message: Hello, world recv message: Hello, world */client #include stdio.h #include signal.h #include fcntl.h #include stdlib.h #include errno.h #include string.h #ifdef _WIN32 #include WinSock2.h #includeWs2tcpip.h #pragma comment(lib,ws2_32.lib) #else #include unistd.h #include sys/socket.h #include arpa/inet.h #endif#define MAXLINE 128 #define SERV_PORT 7119 typedef struct {char ip[32];int port; }server;void error_quit(const char *str) {fprintf(stderr, %s, str);//如果设置了错误号就输入出错原因 #ifdef _WIN32if (errno ! 0) {const int errmsglen 255;char errmsg[errmsglen];strerror_s(errmsg, errmsglen, errno);fprintf(stderr, : %s, errmsg);} #elseif (errno ! 0)fprintf(stderr, : %s, strerror(errno)); #endifprintf(\n);exit(1); }int main(int argc, char **argv) {int i, res, port; #ifdef _WIN32SOCKET connfd, sockfd, listenfd;WSADATA wsaData;WORD wVersionRequested MAKEWORD(2, 2);WSAStartup(wVersionRequested, wsaData);BOOL bReuseaddr TRUE; #elseint connfd, sockfd, listenfd;unsigned int value 1; #endifchar buffer[MAXLINE];socklen_t clilen;struct sockaddr_in servaddr, sockaddr, connaddr;server other;if (argc ! 2)error_quit(Using: ./client IP Address);//创建用于链接主服务器的套接字 sockfd socket(AF_INET, SOCK_STREAM, 0);memset(sockaddr, 0, sizeof(sockaddr));sockaddr.sin_family AF_INET;sockaddr.sin_addr.s_addr htonl(INADDR_ANY);sockaddr.sin_port htons(SERV_PORT);inet_pton(AF_INET, argv[1], sockaddr.sin_addr);//设置端口可以被重用 #ifdef _WIN32setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)bReuseaddr, sizeof(BOOL)); #elsesetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, value, sizeof(value)); #endif//连接主服务器 res connect(sockfd, (struct sockaddr *)sockaddr, sizeof(sockaddr));if (res 0)error_quit(connect error);//从主服务器中读取出信息 #ifdef _WIN32res recv(sockfd, buffer, MAXLINE,0); #elseres read(sockfd, buffer, MAXLINE); #endifif (res 0)error_quit(read error);printf(Get: %s, buffer);//若服务器返回的是first则证明是第一个客户端 if (f buffer[0]){//从服务器中读取第二个客户端的IPport #ifdef _WIN32res recv(sockfd, buffer, MAXLINE, 0);sscanf_s(buffer, %s %d, other.ip,other.port); #elseres read(sockfd, buffer, MAXLINE);sscanf(buffer, %s %d, other.ip, other.port); #endifprintf(ff: %s %d\n, other.ip, other.port);//创建用于的套接字 connfd socket(AF_INET, SOCK_STREAM, 0);memset(connaddr, 0, sizeof(connaddr));connaddr.sin_family AF_INET;connaddr.sin_addr.s_addr htonl(INADDR_ANY);connaddr.sin_port htons(other.port);inet_pton(AF_INET, other.ip, connaddr.sin_addr);//尝试去连接第二个客户端前几次可能会失败因为穿透还没成功 //如果连接10次都失败就证明穿透失败了可能是硬件不支持 while (1){static int j 1;res connect(connfd, (struct sockaddr *)connaddr, sizeof(connaddr));if (res -1){if (j 10)error_quit(cant connect to the other client\n);printf(connect error, try again. %d\n, j); #ifdef _WIN32Sleep(1); #elsesleep(1); #endif}elsebreak;} #ifdef _WIN32strcpy_s(buffer, MAXLINE, Hello, world\n); #elsestrcpy(buffer, Hello, world\n); #endif//连接成功后每隔一秒钟向对方客户端2发送一句hello, world while (1){ #ifdef _WIN32res send(connfd, buffer, strlen(buffer) 1,0); #elseres write(connfd, buffer, strlen(buffer) 1); #endifif (res 0)error_quit(write error);printf(send message: %s, buffer); #ifdef _WIN32Sleep(1); #elsesleep(1); #endif}}//第二个客户端的行为 else{//从主服务器返回的信息中取出客户端1的IPport和自己公网映射后的port #ifdef _WIN32sscanf_s(buffer, %s %d %d, other.ip, other.port, port); #elsesscanf(buffer, %s %d %d, other.ip, other.port, port); #endif//创建用于TCP协议的套接字 sockfd socket(AF_INET, SOCK_STREAM, 0);memset(connaddr, 0, sizeof(connaddr));connaddr.sin_family AF_INET;connaddr.sin_addr.s_addr htonl(INADDR_ANY);connaddr.sin_port htons(other.port);inet_pton(AF_INET, other.ip, connaddr.sin_addr);//设置端口重用 #ifdef _WIN32BOOL bReuseaddr TRUE;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)bReuseaddr, sizeof(BOOL)); #elsesetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, value, sizeof(value)); #endif//尝试连接客户端1肯定会失败但它会在路由器上留下记录 //以帮忙客户端1成功穿透连接上自己 res connect(sockfd, (struct sockaddr *)connaddr, sizeof(connaddr));if (res 0)printf(connect error\n);//创建用于监听的套接字 listenfd socket(AF_INET, SOCK_STREAM, 0);memset(servaddr, 0, sizeof(servaddr));servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr htonl(INADDR_ANY);servaddr.sin_port htons(port);//设置端口重用 #ifdef _WIN32setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)bReuseaddr, sizeof(BOOL)); #elsesetsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, value, sizeof(value)); #endif//把socket和socket地址结构联系起来 res bind(listenfd, (struct sockaddr *)servaddr, sizeof(servaddr));if (-1 res)error_quit(bind error);//开始监听端口 res listen(listenfd, INADDR_ANY);if (-1 res)error_quit(listen error);while (1){//接收来自客户端1的连接 connfd accept(listenfd, (struct sockaddr *)sockaddr, clilen);if (-1 connfd)error_quit(accept error);while (1){//循环读取来自于客户端1的信息 #ifdef _WIN32res recv(connfd, buffer, MAXLINE,0); #elseres read(connfd, buffer, MAXLINE); #endifif (res 0)error_quit(read error);printf(recv message: %s, buffer);} #ifdef _WIN32closesocket(connfd); #elseclose(connfd); #endif}}return 0; }golang的参考 github.com/ethereum/go-ethereum/ 参考 https://blog.csdn.net/muxuen/article/details/137231514 5运行结果暂时手上没有公网服务器请自行编译测试 如果觉得有用麻烦点个赞加个收藏
http://www.ho-use.cn/article/10822357.html

相关文章:

  • 做一个小程序需要多少钱?seo发包软件
  • 企业网站建设中期报告模板wordpress在哪
  • 如何建立一个私人网站做电子商务网站价格
  • 西安企业网站制作试描述一下网站建设的基本流程图
  • 视频网站建设成本海阳玖网站建设
  • 有没有做吉祥物的网站无锡电子商务网站建设公司
  • 造纸公司网站建设做网站常德
  • 免费网站建设合同范本网站建设技术要求
  • 中太建设集团股份有限公司网站网站类网站开发犯罪吗
  • 长春电商网站建设哪家专业免费算生辰八字算命
  • 好网站你知道的wordpress 郁思注意
  • 微网站开发案例建设网站不用模板可以吗
  • 大连公司网站开发wordpress恢复
  • 做网站后期费用去长沙旅游攻略及费用
  • 印花图案设计网站免备案虚拟主机哪家强
  • 珠海市网站建设怎么样淘宝店招图片大全免费
  • 网站建设与网页设计实训报告水滴信用企业查询官网
  • 建设银行报考网站品牌加盟最好的网站建设
  • 小白网站搭建教程河北建设人才网官网
  • 深圳外贸网站制作公司石景山 网站建设
  • 内江规划建设教育网站网站微信支付申请流程
  • 长春火车站到吉大二院wordpress 获取当前自定义分类
  • 做的网站怎样评估价值朗域装饰口碑怎么样
  • 省交通建设质安监督局网站网站建设常用模板
  • 网站内搜索wordpress图片位置
  • 杭州网络公司做网站报价企业展厅装修
  • react.js做的网站网络推广的主要工作内容
  • 宣传片素材网站造价员证在哪个网站上查询
  • 如何用frontpage2003做网站手机商城oppo
  • 网站分几种广州网站开发多少钱