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

しょうじょ少女直播常州网站排名优化

しょうじょ少女直播,常州网站排名优化,网站地图怎么提交,wordpress 图片水印插件目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套…目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套接字) 1.3 Linux和Windows套接字的区别 1.4 套接字特性 1.4.1 socket函数 1.4.1.1 协议族信息domain形参 1.4.1.2  套接字类型Type形参 1.4.1.2.1 面向连接的套接字SOCK_STREAM 1.4.1.2.2 面向消息的套接字SOCK_DGRAM 1.4.1.3 协议的最终选择protocol形参 2. 地址族和数据序列 2.1 网络地址 2.1.1 IPv4常用 2.1.1.1 网络地址和主机地址 2.1.2 端口号 2.1.3 bind函数 2.1.3.1 sockaddr_in结构体 2.1.4 网络字节序 2.1.5 字节序转换 2.1.6 网络地址的初始化和分配 2.1.6.1 inet_addr函数 2.1.6.2 inet_aton函数Windows不存在此函数 2.1.6.3 inet_ntoa函数和inet_aton函数相反 2.1.6.4 INADDR_ANY常数 2.1.6.5 WSAStringToAddress函数只有Windows平台有不利于兼容性 2.1.6.6 WSAAddressToString函数只有Windows平台有不利于兼容性 2.1.6.7 服务器端初始化IP地址时非常明确为什么还要进行IP的初始化呢 3.其余流程函数 3.1 进入连接等待状态listen函数 3.2 受理客户端连接请求accpet函数 3.3 客户端请求连接connect函数 4. 基于TCP的服务器端/客户端函数调用关系 网络编程编写程序使两台连网的计算机进行数据交换。 1. 套接字 操作系统提供名为套接字的部件套接字是网络数据传输用的软件设备它能够连接到因特网上与远程计算机进行数据传输。 1.1 在Linux平台下构建套接字 对于Linux而言socket操作与文件操作没有区别。如close函数不仅可以关闭文件也可以关闭套接字。 1.1.1 用于接听的套接字(服务器端套接字) 第一步调用socket函数创建套接字 #includests/socket.h int socket(int domain,int type,int protocol); 成功返回文件描述符失败返回-1 第二步调用bind函数分配IP地址和端口号 #includests/socket.h int bind(int sockfd,struct sockaddr* myaddr,socklen_t addrlen); 成功返回0失败返回-1 第三步调用listen函数转为可接收请求状态 #includests/socket.h int listen(int sockfd,int backlog); 成功返回0失败返回-1 第四步调用accept函数受理连接请求 #includests/socket.h int accept(int sockfd,struct sockaddr* addr,socklen_t* addrlen); 成功返回文件描述符失败返回-1 accpet函数一直等待直到有连接请求时才会有返回值。 第五步调用write函数发送数据 #includeunistd.hssize_t write(int fd,const void* buf,size_t nbytes); 成功则返回写入的字节数失败返回-1 fd文件描述符参数 buf保存要传输数据的缓冲地址值 nbytes要传输数据的字节数 第六步关闭套接字 #includeunistd.hint close(int fd); 成功返回0失败返回-1 fd文件描述符参数。  close函数不仅可以关闭文件也可以关闭套接字。 客户端调用close会向服务端的客户端套接字文件描述符传递EOF。 1.1.2 用于发送请求的套接字(客户端套接字) 第一步调用socket函数创建套接字 如上。 第二步调用connect函数连接服务器端 #includests/socket.h int connect(int sockfd,struct sockaddr* serv_addr,socklen_t addrlen); 成功返回0失败返回-1 第三步调用read函数读取服务器传输的信息 #includeunistd.hssize_t read(int fd,void *buf,size_t nbytes); 成功则返回接收的字节数但遇到文件结尾则返回0失败返回-1 fd数据接收对象的文件描述符参数 buf保存接收数据的缓冲地址值 nbytes要接收数据的字节数 第四步关闭套接字 如上。 1.2 在Windows平台下构建套接字 在Windows平台下构建套接字要先进行Winsock的初始化。 1.2.1 Winsock的初始化 初始化版本库 #includewinsock2.hint WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); 成功返回0失败返回非0的错误代码值 wVersionRequestedWORD是通过typedef定义的unsigned short类型这个参数是提供套接字版本信息。可借助MAKEWORD宏函数来构建版本信息如 MAKEWORD(1,2); //主版本为1副版本为2返回0x0201 MAKEWORD(2,2); //主版本为2副版本为2返回0x0202 lpWSAData传入WSADATA型结构体变量地址LPWSADATA是WSADATA的指针类型调用完函数后会将相关参数填充到这个参数里。 WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2),wsaData)!0) {...... } 注销版本库 #includewinsock2.hint WSACleanup(void); 成功返回0失败返回SOCKET_ERROR 销毁Winsock相关库无法再调用Winsock相关函数。 1.2.2 用于接听的套接字(服务器端套接字) 第一步调用socket函数创建套接字 #include winsock2.h SOCKET socket(int af,int type,int protocol); 成功返回套接字句柄失败返回INVALID_SOCKET 第二步调用bind函数分配IP地址和端口号 #include winsock2.h int bind(SOCKET s,const struct sockaddr* name,int namelen); 成功返回0失败返回SOCKET_ERROR 第三步调用listen函数转为可接收请求状态 #include winsock2.h int listen(SOCKET s,int backlog); 成功返回0失败返回SOCKET_ERROR 第四步调用accept函数受理连接请求 #include winsock2.h SOCKET accept(SOCKET s,struct sockaddr* addr,int* addrlen); 成功返回文件描述符失败返回INVALID_SOCKET accpet函数一直等待直到有连接请求时才会有返回值。 第五步调用send函数发送数据 #includewinsock2.h int send(SOCKET s,const char* buf,int len,int flags); 成功返回传输字节数失败返回SOCKET_ERROR s表示数据传输对象连接的套接字句柄值 buf 保存待传输数据的缓冲地址值 len要传输的字节数 flags传输数据时用到的多种选项信息 第六步关闭套接字 #include winsock2.h int closeconnect(SOCKET s); 成功返回0失败返回SOCKET_ERROR 1.2.3 用于发送请求的套接字(客户端套接字) 第一步调用socket函数创建套接字 如上。 第二步调用connect函数连接服务器端 #include winsock2.h int connect(SOCKET s,const struct sockaddr* name,int namelen); 成功返回0失败返回SOCKET_ERROR 第三步调用recv函数接收服务器端传来的数据 #include winsock2.h int recv(SOCKET s,const char* buf,int len,int flags); 成功返回接收的字节数收到EOF时为0失败返回SOCKET_ERROR s表示数据接收对象连接的套接字句柄值 buf 保存接收数据的缓冲地址值 len要接收的最大字节数 flags接收数据时用到的多种选项信息 第四步关闭套接字 如上。 1.3 Linux和Windows套接字的区别 文件描述符和句柄的区别 在Linux中文件描述符是不区分文件和套接字的即两个都是一样的 在Windows中句柄是区分文件和套接字的并不完全一样。 比较两个系统的socket、listen和accept函数可以发现其实Linux的int sockfd就对应于Windows的SOCKET s即SOCKET这个类型就存有套接字句柄整形值也类似于一种编号。 write和send的区别 在Linux中有write也有send函数来传输数据。 在windows中send函数只是比Linux中的write函数多了最后的flag参数。 1.4 套接字特性 1.4.1 socket函数 int socket( int domain, //套接字中使用的协议族(Protocol Family)信息 int type, //套接字数据传输类型信息 int protocol //计算机间通信中使用的协议信息 ); 成功返回文件描述符失败返回-1 一个socket套接字协议族套接字类型最终协议。 1.4.1.1 协议族信息domain形参 协议族套接字通信中协议的分类。 名称协议族PF_INET常用IPv4互联网协议族PF_INET6IPv6互联网协议族PF_LOCAL本地通信的UNIX协议族PF_PACKET底层套接字的协议族PF_IPXIPX Novell协议族 1.4.1.2  套接字类型Type形参 套接字类型套接字的数据传输方式。 1.4.1.2.1 面向连接的套接字SOCK_STREAM 特点 传输过程中数据不会丢失按序传输数据传输的数据不存在数据边界套接字连接必须一一对应一个客户端套接字对应服务器端的一个套接字n个对应n个套接字 总结可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字。注意接收和发送数据大小要相等。 特点传输过程中数据不会丢失、传输的数据不存在数据边界解释         在接收的套接字内部有一个由字节数组组成的缓冲区从传输端传过来的数据会先存储到这个缓冲区里如果缓冲区满了那么传输端就会停止传输等待缓冲区中的数据被读取完再继续传输。其中传输出错也会进行重传服务除特殊情况外不会有数据丢失。 1.4.1.2.2 面向消息的套接字SOCK_DGRAM 特点 快速传输传输的数据可能丢失、损毁传输的数据有数据边界限制每次传输的大小 总结不可靠的不按序传递的、以数据的高速传输为目的的套接字不存在连接的概念。注意接收和发送数据次数要相等。 特点传输的数据具有数据边界解释         每次传输都有大小限制如果超过了这个限制那么就得分批发送即意味着接收数据的次数应和传输次数相同。而面向连接的套接字没有这个要求。 1.4.1.3 协议的最终选择protocol形参 第三个参数的意义同一协议族中存在多个数据传输方式相同的协议。 与套接字类型对应的 面向连接的套接字TCP套接字IPPROTO_TCP注意接收和发送数据大小要相等。面向消息的套接字UDP套接字IPPROTO_UDP注意接收和发送数据次数要相等。 2. 地址族和数据序列 IPInternet Protocol网络协议为收发网络数据而分配给计算机的值。 端口号区分程序中创建的套接字而分配给套接字的序号。 2.1 网络地址 分为两类IPv44字节地址族、IPv616字节地址族。 2.1.1 IPv4常用 IPv4标准的4字节IP地址由网络地址和主机地址组成。 2.1.1.1 网络地址和主机地址 IPv4分为如下A、B、C、D四种类型 通过首字节可以判断其属于哪种类型 首字节范围类型0~127A128~191B192~223C 向对应IP地址主机传输数据是先通过网络地址查找到对应的路由器或交换机再由路由器或交换机根据主机ID将数据分发到主机上。如图将数据发送到203.211.172.103上会先找到网络地址为203.211.172的路由器路由器再通过主机ID103将数据传输给对应主机。 2.1.2 端口号 端口号由16位构成可分配端口号范围为0~65535但0~1023是知名端口号会分配给特定应用程序所以应当分配此范围之外的值。另外虽然端口号不能重复但TCP套接字和UDP套接字不会共用端口号所以允许重复。例如某TCP套接字用了9130端口则其余TCP套接字不能使用此端口但UDP套接字可以使用9130端口。 2.1.3 bind函数 #includests/socket.h int bind(int sockfd,struct sockaddr* myaddr,socklen_t addrlen); 成功返回0失败返回-1 2.1.3.1 sockaddr_in结构体 sockaddr_in保存IPv4地址信息的结构体。 struct sockaddr_in {sa_family_t sin_family; //地址族uint16_t sin_port; //16位TCP/UDP端口号struct in_addr sin_addr; //32位IP地址char sin_zero[8]; //不使用 }struct in_addr {in_addr_t s_addr; //32位IPv4地址 }struct sockaddr {sa_family_t sin_family; //地址族char sa_data[14]; //地址信息 } 数据类型是POSIX可移植操作系统接口POSIX是为UNIX系列操作系统设立的标准。 1.sin_family成员 2.sin_port成员 保存16位端口号是以网络字节序保存的。 3.sin_addr成员 保存32位IP地址信息也是以网络字节序保存的。 4.sin_zero成员 无特殊含义。只是为了使结构体sockaddr_in和sockaddr结构体大小保持一致插入的成员。 为什么我们平常的使用要先填充 sockaddr_in结构体再转换为sockaddr结构体而不直接填充sockaddr结构体呢 答因为sockaddr结构体中sa_data[14]数据的填充很麻烦其中需包含IP地址和端口号并且其余部分都要填充为0才能使用。不如直接使用sockaddr_in结构体再进行转换。填充复杂的原因是sockaddr结构体并不仅仅为IPv4而设计。 2.1.4 网络字节序 不同CPU中向内存保存数据的方式有两种一种是正序直接保存一种是倒序保存这意味着CPU解析数据的方式也分为两种 大端序高位字节存放到低位地址小端序高位字节存放到高位地址 所以在数据传输时必须统一方式这种方式就称为网络字节序即统一为大端序。即先把数据统一转化为大端序的格式再进行网络传输所以在填充sin_addr成员和sin_port成员时需要以网络字节序保存。 2.1.5 字节序转换 主机字节序和网络字节序的相互转换被称为字节序转换。有以下函数进行转换 unsigned short htons(unsigned short); //把short类型数据从主机字节序转换为网络字节序 unsigned short ntohs(unsigned short); //把short类型数据从网络字节序转换为主机字节序 unsigned long htonl(unsigned long); //把long类型数据从主机字节序转换为网络字节序 unsigned long ntohl(unsigned long); //把long类型数据从网络字节序转换为主机字节序 htons中的h表示主机(host)字节序。 htons中的n表示网络(network)字节序。 htons中的s指的是shortshort占2个字节所以常用于端口号的转换。 htonl中的l值得是longLinux中long类型占4个字节所以常用于IP地址的转换。 2.1.6 网络地址的初始化和分配 2.1.6.1 inet_addr函数 #include arpa/inet.h in_addr_t inet_addr(const char *string); 成功则返回32位大端序整数型值失败则返回INADDR_NONE 这个函数帮助我们将字符串形式的IP地址转换为32位整数型数据同时也会进行网络字节序转换。 同时它也会检测无效的IP地址。 2.1.6.2 inet_aton函数Windows不存在此函数 inet_aton函数和inet_addr函数功能上相同。 #include arpa/inet.h int inet_aton(const char *string,struct in_addr* addr); 成功则返回1失败则返回0 string含有需转换的IP地址信息的字符串地址值。 addr将保存转换结果的in_addr结构体变量的地址值。 2.1.6.3 inet_ntoa函数和inet_aton函数相反 #include arpa/inet.h char* inet_ntoa(struct in_addr* addr); 成功则返回转换的字符串地址值失败则返回-1 将网络字节序32位整数型IP地址转换为字符串形式。 注意在使用此函数时返回的结果是一个指针指向字符串信息的地址当第二次使用这个函数时这个地址存有的字符串信息会被覆盖掉所以在使用时需要立即拷贝保存地址存有的字符串信息。 2.1.6.4 INADDR_ANY常数 struct sockaddr_in addr; memset(addr,0,sizeof(addr)); ... addr.sin_addr.s_addrhtonl(INADDR_ANY); INADDR_ANY常数采用这种方式会自动获取运行服务器端的计算机的IP地址不必亲自输入并且若同一计算机中分配有多个IP地址路由器这种则只要端口号一致就可以从不同IP地址里接收数据。所以服务器端优先考虑这种方式。 2.1.6.5 WSAStringToAddress函数只有Windows平台有不利于兼容性 各种类型都是针对默认类型的typedef声明。 #include winsock2.h INT WSAStringToAddress (LPTSTR AddressString,INT AddressFamily,LPWSAPROTOCOL_INFO lpProtocolInfo,LPSOCKADDR lpAddress,LPINT lpAddressLength ); 成功返回0失败返回SOCKET_ERROR AddressString含有IP地址和端口号的字符串地址值 AddressFamily第一个参数中地址所属的地址族信息 lpProtocolInfo设置协议提供者Provider默认为NULL lpAddress保存地址信息的结构体变量地址值 lpAddressLength第四个参数中传递的结构体长度所在的变量地址值。 2.1.6.6 WSAAddressToString函数只有Windows平台有不利于兼容性 各种类型都是针对默认类型的typedef声明。 #include winsock2.h INT WSAAddressToString (LPSOCKADDR lpsaAddress,DWORD dwAddressLength,LPWSAPROTOCOL_INFO lpProtocolInfo,LPTSTR lpszAddressString,LPDWORD lpdwAddressStringLength ); 成功返回0失败返回SOCKET_ERROR lpsaAddress需要转换的地址信息结构体变量地址值 dwAddressLength第一个参数中结构体的长度 lpProtocolInfo设置协议提供者Provider默认为NULL lpszAddressString保存转换结果的字符串地址值 lpdwAddressStringLength第四个参数中存有地址信息的字符串长度 2.1.6.7 服务器端初始化IP地址时非常明确为什么还要进行IP的初始化呢 因为同一个计算机可能分配有多个IP地址实际IP地址和计算机安装的NIC数量相等。所以服务器需要决定应接收哪个IP地址传来的数据所以要服务器端要初始化IP地址。 3.其余流程函数 3.1 进入连接等待状态listen函数 当调用了listen函数服务器端会阻塞等待连接请求状态。意味着只有在此之后客户端才能调用connect函数。 #includests/socket.h int listen( int sockfd, //希望进入等待连接请求状态的套接字文件描述符传递的描述符套接字参数为服务器端套接字 int backlog //连接请求等待队列的长度。 ); 成功返回0失败返回-1 如图 客户端连接请求本身也是从网络中接收到的一种数据而接收数据就需要套接字所以第一个参数服务器端套接字就是充当门卫可回复客户端请求传输请求已收到的信号数据。第二个参数就是可以规定连接请求等候的队列的大小一般与服务器端特性有关像频繁请求的web端则至少要15。 3.2 受理客户端连接请求accpet函数 #includesys/socket.h int accpet( int sock, //服务器套接字的文件描述符 struct sockaddr* addr, //保存发起连接请求的客户端地址信息的变量地址值 socklen_t* addrlen //第二个参数的结构体长度。 ); 成功则返回套接字文件描述符失败则返回-1 accpet函数受理连接请求等待队列中待处理的客户端连接请求。函数调用成功accept函数内部会产生用于数据I/O的套接字并返回其文件描述符。这个套接字是自动创建的并自动与发起连接请求的客户端建立连接。 3.3 客户端请求连接connect函数 #includesys/socket.h int connect( int sock, //客户端套接字文件描述符 struct sockaddr* servaddr, //保存目标服务器端地址信息的变量地址值 socklen_t addrlen //第二个参数的变量长度 ); 成功返回0失败返回-1 connect函数只有以下情况之一才会返回 服务器端接收连接请求所谓的“连接请求”并不意味着服务器端调用accpet函数而是服务器端把连接请求信息记录到等待队列中。所以connect函数返回后并不立即进行数据交换。发生断网等异常情况而中断连接请求 4. 基于TCP的服务器端/客户端函数调用关系 图中的总体流程整理如下:服务器端创建套接字后连续调用bind、listen函数进入等待状态,客户端通过调用connect函数发起连接请求。需要注意的是客户端只能等到服务器端调用listen函数后才能调connect函数。同时要清楚客户端调用connect函数前服务器端有可能率先调用accept函数。当然此时服务器端在调用accept函数时进入阻塞( blocking)状态直到客户端调connect函数为止。
http://www.w-s-a.com/news/300392/

相关文章:

  • 招聘网站做一下要多少钱网站设计公司 国际
  • 巩义专业网站建设公司首选seo研究院
  • 大流量网站解决访问量友情链接如何添加
  • 教育网站建设网永康市住房和城乡建设局网站
  • 阿里巴巴官网网站django 做网站的代码
  • 网站建设 军报wordpress 订餐模板
  • 网站虚拟主机 会计处理石家庄站建设费用多少
  • 网站建设 服务内容 费用简述网站开发流程
  • 公司制作网站跟企业文化的关系空间制作网站
  • 浙江建设监理协会网站个人网站设计规划书
  • wordpress太卡了贵州seo推广
  • 企业介绍微网站怎么做的手机软件商城免费下载
  • 新手网站设计定价网站开发销售
  • 网站开发公司oa有没有找人做标书的网站
  • 传统门户网站有哪些人武部正规化建设
  • 台州网站制作方案免费无代码开发平台
  • 精通网站建设 pdf微盘学做电商的步骤
  • 想在网上做设计接单有没有网站找一个免费域名的网站
  • 湘潭市网站建设科技有限公司杭州网站建设(推荐乐云践新)
  • 优秀网站评析西双版纳傣族自治州民宿
  • 常用的cms建站系统c2c网站模板
  • wordpress更换图标seo网站建设公司
  • 网站备案 深圳小程序怎么进入公众号
  • 实名认证域名可以做电影网站吗坪山网站设计的公司
  • wdcp怎么上传做好的网站管理咨询公司名称参考
  • 设计师网站pin分销系统小程序开发
  • 高端品牌网站建设兴田德润实惠企业网站建设应该怎么做
  • 做研学的网站优秀软文案例
  • 网站个人简介怎么做建设网站卡盟
  • 影楼做网站安庆建设机械网站