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

遵义市建设局网站官网做软件的声称发现网站漏洞

遵义市建设局网站官网,做软件的声称发现网站漏洞,北京网站建设外包公司哪家好,网站开发中遇到的技术问题一.概念在网络通信中#xff0c;传输层中最常用的通信协议有两个#xff1a;TCP协议与UDP协议。这两种协议虽然都可以用于网络通信#xff0c;但是通信方式不同决定了应用场景的不同。与TCP协议相比#xff0c;UDP协议最具特色的不同点有两个#xff1a;无连接与面向数据报…一.概念在网络通信中传输层中最常用的通信协议有两个TCP协议与UDP协议。这两种协议虽然都可以用于网络通信但是通信方式不同决定了应用场景的不同。与TCP协议相比UDP协议最具特色的不同点有两个无连接与面向数据报。一.无连接所谓无连接就是通信的双方不需要在已建立联系的前提下通信换句话说就是信息发送方只管发送数据不需要判断对方是否能够接收到数据。我们知道使用TCP协议通信前需要让双方“连接”即客户端发送连接请求服务器端接收后与之连接只有在连接成功后双方才能互相发送数据。但是UDP协议的双方不需要提前建立“连接”需要发送数据时直接发送“不在乎”对方是否接收。因此相较于TCP协议而言UDP协议较为不安全不可靠有数据丢失的可能。那可能会有人有疑问既然UDP协议的通信方式如此不安全为什么还会有UDP通信协议的存在呢。这是因为虽然UDP的通信方式不安全但是通信成本较低通信方式简单效率高。比如我们观看网络直播晚会正常就是采用的UDP协议因此会出现观看中突然卡顿的现象这极有可能就是UDP发送时出现数据丢失。同时因为观看人数极多如果采用TCP协议那种与每一个用户建立连接又会消耗大量资源。偶尔卡顿对观看体验的降低远小于采用TCP协议所消耗的大量成本。因此网络直播大多采用UDP协议。同样地如果是非常重要的小众会议那么就会采用TCP协议通信。因此UDP协议一般用于通信人数多且对传输数据质量要求低的通信形式比如直播。二.面向数据报所谓面向数据报指的是UDP发送数据时不管报文长度一次发送一整个报文。因此采用UDP协议的通信需要规定好报文长度如果报文过长那么IP层需要切片降低通信效率。而与UDP不同的是TCP协议采用面向字节流的发送方式含义可以参考输入输出流TCP内部有一个缓冲区如果报文过长那么就可以一部分一部分的推送。打个比方当我们买苹果时面向数据报就好比商家把苹果一个一个交给我们手上面向字节流就是商家把一堆苹果装在一个盒子里后把这个盒子交给我们。二.相关套接字编程一.什么是套接字套接字英文名为socket直译是“插座”。插座是用于连接电源和电器达到通电的效果。而套接字是让应用层与传输层通过IP和端口号port锁定其他网络中的进程来达到通信的目的。因此套接字由IP地址、端口号port以及通信协议方式TCP/UDP组成。我们知道在网络通信中通过一个IP地址可以锁定一台主机通过端口号可以锁定一台主机上某一个进程。因此IP地址端口号可以锁定全网中唯一的进程进而达到通信的目的。用户通过使用套接字调用相关API接口就可以与其他主机网络通信本质是与其他主机的某一个进程通信。而对方用户接收、返回数据也是使用套接字调用相关接口。这种使用套接字调用接口从而进行网络通信的方式就是套接字编程。二.UDP套接字编程首先我们应该先了解采用UDP通信协议的套接字编程大体流程。头文件sys/socket.h、sys/types.h①获取套接字调用linux系统接口socket获取一个套接字。第一个参数用来确定套接字类型。我们知道套接字分为三种网络套接字、域间套接字、原始套接字。在网络通信中采用网络套接字类型因此第一个参数需要填入宏AF_INET代表采用网络套接字。第二个参数用来确定套接字的协议类型TCP/UDP。如果是采用UDP协议就是宏SOCK_DGRAM代表面向数据报通信。第三个参数是用来确定通信的协议家族。一般填0,代表用户不指定协议类型由服务商选择通信协议。返回值是一个文件描述符。本质就是打开了一个文件linux下一切皆文件因此该文件描述符会占用进程中files_struct结构体中fd_array数组一个下标。如果打开失败就会返回-1并设置错误码errno。示例如下int sockfd socket(AF_INET, SOCK_DGRAM, 0);②创建带有本机器IP地址和本进程端口号的结构体使用结构体类型为struct sockaddr_in类型进行网络通信时就是通过该结构体中记录地址找到通信目标。//struct sockaddr_in类型内部结构 #define __SOCKADDR_COMMON(sa_prefix) \sa_family_t sa_prefix##family/* Structure describing an Internet socket address. */ struct sockaddr_in{__SOCKADDR_COMMON (sin_);in_port_t sin_port; /* Port number. */struct in_addr sin_addr; /* Internet address. *//* Pad to size of struct sockaddr. */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct in_addr)];};struct sockaddr_in结构体内部有三个参数sin_family、sin_port、sin_addr。第一个参数sin_family用以确定套接字类型网络通信中就是网络套接字即AF_INET。struct sockaddr_in addr; addr.sin_family AF_INET;第二个参数sin_port用于确定该套接字需要连接的端口号即本进程端口号。这里需要格外注意的是因为端口号需要用于网络传输使用在网络中统一采用大端存储的网络字节序。linux提供了接口htons来将数据转为大端存储形式记忆这些函数的方法很简单htons即代表host主机to转到net网络采用short短整形uint16_t的形式。其他函数类比即可。uint16_t port ...//端口号 addr.sin_port htons(port);第三个参数sin_addr用来表示本主机对应的IP地址。因为我们输入的IP地址一般采用字符串类型但是在网络中需要使用in_addr_t类型本质就是32位无符号整数。因此采用函数inet_addr可以将字符串转为in_addr_t类型或者函数inet_atoninet_aton函数如果成功返回非0失败返回0。string IP 127.0.0.1;//示例 addr.sin_addr.s_addr inet_addr(IP.c_str());//方式一 int i inet_aton(IP.c_str(), addr.sin_addr.s_addr);//方式二③绑定绑定结构体与套接字在创建好记录IP地址和端口号的结构体struct sockaddr_in之后需要将该结构体和套接字绑定到一起调用bind接口进行绑定该函数第一个参数是我们需要绑定的套接字文件描述符也就是socket函数的返回值。第二个参数是要绑定的网络通信结构体也就是我们第二步创建的struct sockaddr_in。因为bind函数采用struct sockaddr类型因此需要将我们创建的结构体强转一下。那么可能有人会有疑问bind函数参数为什么是struct sockaddr类型而不是struct sockaddr_in类型呢这俩有什么区别么——有区别struct sockaddr类型是早期的网络通信结构体但是其内部结构并不合理IP地址与端口号都采用成员sa_data来表示//struct sockaddr类型内部结构 /* Structure describing a generic socket address. */ struct sockaddr{__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */char sa_data[14]; /* Address data. */};因此后来出现了struct sockaddr_in类型能够将IP地址和端口号用两个成员分开表示。bind函数第三个参数是struct sockaddr类型结构体的大小。返回值为0代表绑定成功-1代表绑定失败。int i bind(sockfd, (struct sockaddr*)addr, sizeof addr); if(i 0) {//绑定失败 } //绑定成功④通信发送 接收发送时采用sendto系统接口。根据目标地址的IP地址和端口号或者说struct sockaddr结构体将数据发送过去。该函数第一个参数是本进程使用的套接字文件描述符给对方发数据要把自己的信息传过去这样对方才能回复。第二个参数是指针类型指向要发送数据。第三个参数是数据大小。这两个参数可以参考write函数第二、三个参数含义。第4个参数代表发送数据策略一般填0代表正常操作。具体可以参考这篇博客linux socket中 send recv函数的 flags参数第四、五个参数代表数据接收方的struct sockaddr结构体。在使用sendto函数之前要先获取到对方的IP地址和端口号创建struct sockaddr_in结构体后再调用sendto函数。返回值为实际发送数据的长度发送失败返回-1。示例如下char buf[1024]; //制作数据... struct sockaddr_in client;//创建数据目标接收方的结构体 //记录接收方的IP地址和端口号 int i sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)client, sizeof client);//发送数据 if(i 0) {//发送失败 }上述示例中有一点需要注意发送数据的大小应该是实际数据的长度而不是整个buf容器的大小。当然UDP协议采用面向数据报的形式传buf大小没有关系但如果是TCP协议那样采用字节流的形式时就会出错这一点将在讲解TCP协议的博客中说明。接收时采用recvfrom函数。在没有接收到数据之前会阻塞在recvfrom函数上。该函数第一个参数同sendto函数也是本进程创建的套接字文件描述符。第二个参数为输出型参数用于获取接收到的数据。第三个参数是提供的接收数据容器的大小。这两个参数含义同系统read函数第二、三个参数。第四个参数含义同sendto函数不再解释一般填0。第五、六个参数也是输出型参数用于获取数据发送方的网络通信结构体和结构体长度。本质是为了获取对方的IP地址和端口号便于我方向对方主机回复数据。返回值代表实际接收到的数据大小接收失败返回-1。值得一提的是如果对方进程关闭了recvfrom函数并不会返回-1而是一直阻塞。示例如下char buf[1024];//用于接收数据 struct sockaddr_in server; socklen_t leng sizeof server; int i recvfrom(sockfd, buf, sizeof buf - 1, 0, (struct sockaddr*)server, leng); //此时server内部记录的已经是发送方的IP地址和端口号 if(i 0) {//接收失败 } buf[i] \0;三.UDP协议通信场景模拟①服务端服务端的任务有三个建立UDP协议、等待接收客户端数据、处理数据后发送给客户端。需要注意的是实际开发中服务器启动后就会一直运行因此服务器接收、处理、发送数据的程序应该是死循环。同时因为实际中一个服务器会有多个网卡即多个IP地址采用INADDR_ANY宏定义记录IP地址后服务器会监听本机所有IP地址。INADDR_ANY本质就是0.0.0.0。伪代码如下class Server { public:Server(const uint16_t port)//获取端口号: _port(port){}bool initServer()//初始化服务器{// 获取套接字插座_socket socket(AF_INET, SOCK_DGRAM, 0);...// 创建本端口结构体struct sockaddr_in local; ...local.sin_addr.s_addr INADDR_ANY;//监听本机所有IP地址 // 绑定int i bind(_socket, (struct sockaddr *)local, sizeof local);...return true;}void startServer()//启动服务器{char buf[1024]; // 接收数据的缓冲区// 启动服务器死循环for (;;){// 接收数据...ssize_t i recvfrom(_socket, buf, sizeof buf, 0, (struct sockaddr *)client, len);if (i 0){...//处理数据 //处理后将数据交给客户端 sendto(_socket, replyBuf.c_str(), replyBuf.size(), 0, (struct sockaddr *)client, sizeof client);}else{...//接收数据失败}bzero(buf, sizeof(buf));}}private:uint16_t _port;int _socket; };②客户端客户端的任务有三个获取服务器端套接字、发送数据给服务器、接收服务器数据。同服务器端一样也采用死循环的形式。需要注意的是客户端在通信时只需要提前建立好本机套接字并不需要绑定到特定端口号和IP地址这是因为可能会有多个客户端如果同时绑定的话可能会发生绑到同一个端口的错误行为因此绑定的任务直接交给操作系统。伪代码如下//客户端启动格式 ./client.cpp 服务端IP地址 服务端端口号 int main(int argc, char *argv[]) {if (argc ! 3){...//格式错误}//建立本机套接字sockfd socket(AF_INET, SOCK_DGRAM, 0);//确定服务端IP和端口号通信使用struct sockaddr_in svr;bzero(svr, sizeof(svr));svr.sin_family AF_INET;svr.sin_addr.s_addr inet_addr(argv[1]);svr.sin_port htons(atoi(argv[2]));for (;;)//死循环{...//客户端制造数据//发送数据给服务器sendto(fd, str.c_str(), str.size(), 0, (struct sockaddr *)svr, sizeof svr);struct sockaddr_in addr;//用于记录服务器IP和端口...//接收服务器数据recvfrom(fd, buf, sizeof buf, 0, (struct sockaddr *)addr, len);...//处理服务器数据}return 0; }任何优秀的大软件里面都是一个优秀的小程序。— Charles Antony Richard Hoare如有错误敬请斧正
http://www.dnsts.com.cn/news/256323.html

相关文章:

  • 注册域名建设网站上海网站关键词
  • 罗湖商城网站建设多少钱网站如何搭建
  • 免费文档网站php网站开发最低配置
  • 深圳企业网站制作设计方案动漫设计专科学校
  • 搜搜提交网站入口拥有服务器后如何做网站
  • 怎样提高网站访问速度徐州建站服务
  • 在凡科建设网站的流程网站运营报告
  • 网站页面术语昆山专业网站建设公司
  • 如何建立网站管理系统岳阳网站搭建
  • 网站排名搜索使用他人api做网站
  • 网站导航设置杭州工作招聘网
  • 网址的二级域名金华百度seo
  • gg服务器租用网站食品包装设计ppt
  • 如何做淘宝商城网站设计国际物流网站制作模板
  • 深圳 购物网站wordpress 4.7.2下载
  • 淮南高端网站建设邯郸网站建设策划方案
  • 爬虫 网站开发实例昆山科技网站建设
  • 网站界面设计需要首先做市场研究对吗小程序网页设计
  • 做一款小说网站网站后台上图片后网页显示不正确
  • 公司网站建设意见和建议wordpress设置文章图片幻灯片放映
  • 深圳外贸网站建设服务收费深圳网站优化软件
  • 徐州专门做网站水煮鱼wordpress
  • 小说网站防盗做的好wordpress 插件 函数
  • 视频网站 做综艺 电视台遵义网站建设找工作
  • 医院网站建设方案有做装修效果图赚钱的网站吗
  • 网站付费推广方式管理手机网站模板
  • 怎样将整个网站电子商务网站开发的基本流程
  • 适合这手机浏览器主页的网站一站式做网站服务
  • 东莞百度网站快速优化品牌网站怎么建立
  • 顶尖的郑州网站建设如何做网站首页