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

信息可视化网站怎么网站改版

信息可视化网站,怎么网站改版,有什么正网站做兼职的,网站 psd前面介绍的函数基本上都是TCP协议的#xff0c;如listen#xff0c;connect#xff0c;accept 等函数#xff0c;这都是为可靠传输协议TCP定制的。对于另一个不可靠udp协议#xff08;通信系统其可靠性交由上层应用层负责#xff09;#xff0c;则主要由两个函数完成如listenconnectaccept 等函数这都是为可靠传输协议TCP定制的。对于另一个不可靠udp协议通信系统其可靠性交由上层应用层负责则主要由两个函数完成sendto 和 recvfrom 函数。这里先介绍 sendto 函数。 说明sendto 和 recvfrom 函数不限于udp协议这里只是udp协议当中是采用这两个函数实现的所以就放在udp协议中介绍。 对于 udp 协议的介绍和编程实现请参考下文UDP 客户/服务器简单 Socket 程序 简要介绍下UDP数据报格式相比TCP数据报格式实在是简洁不少。 上面的各个字段含义一目了然上面是16是表示该字段占16bitudp头部占8字节其中长度指的是此 UDP 数据报的长度包括 UDP 数据报头部和 “数据” 部分。 一、应用层——sendto 函数 [cpp]  view plain copy print ? #include sys/socket.h   ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,                  const struct sockaddr *to, socklen_t *addrlen);   //若成功则返回写的字节数出错则返回-1   /*参数解析  前面三个参数分别表示套接字描述符指向写出缓冲区的指针和写字节数。  to指向一个含有数据报接收者的协议地址如IP地址和端口号的套接字地址结构其大小由addrlen参数指定  */   该函数的作用是向指定端口发送给定地址中的指定大小数据如客户端sockfd向 to 指定的远端套接字发送buff 缓冲区内nbytes 个字节数据 二、BSD Socket层——sock_sendto 函数 [cpp]  view plain copy print ? /*   *  Send a datagram to a given address. We move the address into kernel   *  space and check the user space data area is readable before invoking   *  the protocol.   */   //发送数据给指定的远端地址主要用于UDP协议   //前面三个参数分别表示套接口描述字、指向缓冲区的指针和读写字节数   //addr指向一个含有数据包接收者的协议地址(含ip地址和端口号)的套接口地址结构   //其大小由addr_len参数指定   //该函数的作用就是向指定地址的远端发送数据包将buff缓冲区中len大小的数据发送给addr指定的远端套接字   static int sock_sendto(int fd, void * buff, int len, unsigned flags,          struct sockaddr *addr, int addr_len)   {       struct socket *sock;       struct file *file;       char address[MAX_SOCK_ADDR];       int err;       //参数有效性检查       if (fd  0 || fd  NR_OPEN || ((file  current-files-fd[fd])  NULL))           return(-EBADF);       //找到给定文件描述符对应的socket结构       if (!(sock  sockfd_lookup(fd, NULL)))           return(-ENOTSOCK);          if(len0)           return -EINVAL;       //检查权限buff中len个字节区域是否可读       errverify_area(VERIFY_READ,buff,len);       if(err)           return err;       //从addr拷贝addr_len大小的数据到address       if((errmove_addr_to_kernel(addr,addr_len,address))0)           return err;       //调用下层函数sendto,inet域为inet_sendto函数       return(sock-ops-sendto(sock, buff, len, (file-f_flags  O_NONBLOCK),           flags, (struct sockaddr *)address, addr_len));   }   三、INET Socket层——inet_sendto 函数 [cpp]  view plain copy print ? //INET socket层   tatic int inet_sendto(struct socket *sock, void *ubuf, int size, int noblock,        unsigned flags, struct sockaddr *sin, int addr_len)         //得到socket对应的sock结构   struct sock *sk  (struct sock *) sock-data;   //判断该套接字的有效性是否处于关闭状态(半关闭)   if (sk-shutdown  SEND_SHUTDOWN)    {       send_sig(SIGPIPE, current, 1);       return(-EPIPE);   }   if (sk-prot-sendto  NULL)        return(-EOPNOTSUPP);   if(sk-err)       return inet_error(sk);   /* We may need to bind the socket. */   //自动绑定一个本地端口号   if(inet_autobind(sk)!0)       return -EAGAIN;   //调用下层传输层函数udp_sendto函数   return(sk-prot-sendto(sk, (unsigned char *) ubuf, size, noblock, flags,               (struct sockaddr_in *)sin, addr_len));   四、传输层 udp_sento 函数 [cpp]  view plain copy print ? static int udp_sendto(struct sock *sk, unsigned char *from, int len, int noblock,          unsigned flags, struct sockaddr_in *usin, int addr_len)   {       struct sockaddr_in sin;       int tmp;          /*        *  Check the flags. We support no flags for UDP sending       */        //udp除了MSG_DONTROUTE外不支持任何其他标志位       if (flags~MSG_DONTROUTE)            return(-EINVAL);       /*       *  Get and verify the address.        */       //对远端地址的合法性检查由于不涉及网络数据传送所以无法验证这个地址存在性              if (usin)        {       //如果明确指定远端地址就直接检查该地址的有效性           if (addr_len  sizeof(sin)) //大小               return(-EINVAL);           memcpy(sin,usin,sizeof(sin));           if (sin.sin_family  sin.sin_family ! AF_INET) //本地地址有效性               return(-EINVAL);           if (sin.sin_port  0) //端口号有效性               return(-EINVAL);       }        else        {       //如果没有明确指定远端地址则检查之前是否调用了connect函数进行了地址绑定           if (sk-state ! TCP_ESTABLISHED)                return(-EINVAL);           //如果进行了绑定则将远端地址设置为这个绑定的地址           sin.sin_family  AF_INET;           sin.sin_port  sk-dummy_th.dest;           sin.sin_addr.s_addr  sk-daddr;       }            /*       *  BSD socket semantics. You must set SO_BROADCAST to permit       *  broadcasting of data.       */       //处理尚未指定本地地址的情况       if(sin.sin_addr.s_addrINADDR_ANY)           sin.sin_addr.s_addrip_my_addr();          //处理广播的情况       if(!sk-broadcast  ip_chk_addr(sin.sin_addr.s_addr)IS_BROADCAST)               return -EACCES;         /* Must turn broadcast on first */          sk-inuse  1;//加锁          /* Send the packet. */       //转调用udp_send函数       tmp  udp_send(sk, sin, from, len, flags);          /* The datagram has been sent off.  Release the socket. */       //数据包以发送释放该套接字前面介绍到这个函数的两个功能       //取决于sk_dead字段是否设置       release_sock(sk);       return(tmp);   }   udp_send 函数 [cpp]  view plain copy print ?  //根据被调用出清楚参数情况   static int udp_send(struct sock *sk, struct sockaddr_in *sin,        unsigned char *from, int len, int rt)   {       struct sk_buff *skb;       struct device *dev;       struct udphdr *uh;       unsigned char *buff;       unsigned long saddr;       int size, tmp;       int ttl;            /*        *  Allocate an sk_buff copy of the packet.       */       //计算所需要分配的封装数据的缓冲区大小        size  sk-prot-max_header  len;       //分配指定大小的sk_buff 结构用于封装数据       skb  sock_alloc_send_skb(sk, size, 0, tmp);             if (skb  NULL)            return tmp;          skb-sk        NULL;    /* to avoid changing sk-saddr */       skb-free      1;//发送完后数据包立即释放udp不提供超时重传       skb-localroute  sk-localroute|(rtMSG_DONTROUTE);//指定路由类型          /*       *  Now build the IP and MAC header.        */               buff  skb-data;//udp首部和有效负载       saddr  sk-saddr;//本地地址       dev  NULL;       ttl  sk-ip_ttl;   #ifdef CONFIG_IP_MULTICAST       //如果目的地址是多播则设置TTL值为1表示局限于本地网络不可跨越路由器          if (MULTICAST(sin-sin_addr.s_addr))           ttl  sk-ip_mc_ttl;   #endif       //创建MAC首部和IP首部       tmp  sk-prot-build_header(skb, saddr, sin-sin_addr.s_addr,               dev, IPPROTO_UDP, sk-opt, skb-mem_len,sk-ip_tos,ttl);          skb-sksk;//关联  /* So memory is freed correctly */              /*       *  Unable to put a header on the packet.       */                          if (tmp  0 ) //创建失败       {           sk-prot-wfree(sk, skb-mem_addr, skb-mem_len);           return(tmp);       }              buff  tmp;//定位到udp首部位置       saddr  skb-saddr; /*dev-pa_addr;*/       //数据报sk_buff中挂载的数据部分长度:下面注释len是有效数据负载长度       skb-len  tmp  sizeof(struct udphdr)  len;    /* len  UDP  IP  MAC */       skb-dev  dev;//网络接口设备              /*       *  Fill in the UDP header.        */       //udp首部字段的初始化       uh  (struct udphdr *) buff;       uh-len  htons(len  sizeof(struct udphdr));//长度字段       uh-source  sk-dummy_th.source;//源端端口sk中tcp首部字段       uh-dest  sin-sin_port;//目的端口       buff  (unsigned char *) (uh  1);//定位到数据部分       //MAC header | IP Header | UDP Header | Data       //uh本身已经指向了udp首地址uh1表示后移一个udp首部大小位置定位到了数据负载          /*       *  Copy the user data.        */       //从from拷贝len大小的数据到buff即把应用层中待发送的缓冲区的数据拷贝到数据包的数据负载中       //然后通过数据包整体打包发送出去。       //就好比货物搭上了货轮开往目的地为啥不是火车呢因为火车线路已经固定好了只能这么走。       memcpy_fromfs(buff, from, len);          /*       *  Set up the UDP checksum.        */       //同tcp这里进行udp校验和检查        udp_send_check(uh, saddr, sin-sin_addr.s_addr, skb-len - tmp, sk);          /*        *  Send the datagram to the interface.        */               udp_statistics.UdpOutDatagrams;       //调用ip_queue_xmit函数将数据包发往网络层模块处理。以下处理就和TCP协议一样了二者的差异只在于传输层       //该函数以及更下层数据传送前面已经介绍       sk-prot-queue_xmit(sk, dev, skb, 1);       return(len);   }   关于ip_queue_xmit 函数的介绍以及更下层的数据传送参见博文 【Linux 内核网络协议栈源码剖析】数据包发送 可以看出udp是一种无连接传输层协议不像tcp那样需要服务器监听也不必等待客户端与服务器建立连接后才能通信效率优于tcp协议但udp则不能保证数据传输的可靠性。 udp 的数据传输实现并不像tcp那样要建立一条数据传输通道而是直接创建套接字后直接传送数据到给定的远端提供远端地址数据传送过程无超时重传和序列号校验工作适用于数据传输的连续性比数据的完整性更重要的场合允许数据在传输过程中有部分丢失如IP电话、流媒体通信等。
http://www.dnsts.com.cn/news/193379.html

相关文章:

  • 有了域名 怎么做网站长沙网站制作app开发公司
  • 杭州网站制用友公司能不能做网站建设
  • 长春网站建设公司哪个好前端 模板 网站
  • 用静态网站更新安阳哪里有做网站的
  • 电信改公网ip可以做网站吗旅游网站建设市场分析
  • 网站首页关键词优化类似wordpress的博客
  • 个人商城网站能备案吗学院网站建设建议
  • 我做动作你来猜的网站企业网站价格花
  • 网站怎么做百度商桥开发公司名称起名大全
  • 搭建一个wordpress网站多钱网页页面制作公司
  • 一流的内蒙古网站建设青岛手机建站多少钱
  • 免费网站推广ymdir本地wordpress怎么弄网站
  • 物流网站建设 市场分析网站流量功能更怎么做
  • 网站开发实训室wordpress栏目加密
  • 网站app制作费用单html5怎么做网站
  • 重庆网站建设合肥公司app制作怎样可以快速
  • 在ps中网站界面应做多大广州营销型网站建设
  • 做折扣的网站有哪些合肥正规制作网站公司
  • 网站开发项目经理岗位职责成都今晚全部解封
  • 南昌企业网站设计建设制作济南公司注册网站建设
  • 陕西省城乡建设厅网站wordpress 自动生成标签
  • 旅游在线网站开发西安百度推广排名
  • 开一个做网站的公司邯郸网站制作地方
  • 如何搭建情侣网站电脑版qq在线登录网页入口
  • 做百度关键词网站泉州关键词网站排名
  • 洛阳市新区建设投资有限公司网站网站推广经理招聘
  • 为什么亿唐网不做网站做品牌企业网络营销策划书范文
  • 网站建设听取需求公众号模板网站
  • 免费解析网站制作163注册企业邮箱
  • 建设网站的协议范本建什么网站 做 cpa