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

本标准在住房城乡建设部门户网站网站上的链接怎么做的

本标准在住房城乡建设部门户网站,网站上的链接怎么做的,网站制做公司,百度快速排名工具进程间通信#xff1a; 特点#xff1a;依赖于内核#xff0c;造成缺陷——无法实现多机通信。 网络#xff1a; 地址#xff1a;由IP地址#xff08;IP地址是IP协议提供的一种统一的地址格式#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址#xf…进程间通信 特点依赖于内核造成缺陷——无法实现多机通信。 网络 地址由IP地址IP地址是IP协议提供的一种统一的地址格式它为互联网上的每一个网络和每一台主机分配一个逻辑地址以此来屏蔽物理地址的差异。和端口号构成所谓的端口就好像是门牌号一样客户端可以通过ip地址找到对应的服务器端但是服务器端是有很多端口的每个应用程序对应一个端口号通过类似门牌号的端口号客户端才能真正的访问到该服务器。为了对端口进行区分将每个端口进行了编号这就是端口号 端口包括逻辑端口和物理端口两种类型实际上是通过IP地址端口号来区分不同服务的端口号提供了一种访问通道服务器一般都是通过知名端口号来识别的。例如对于每个TCP/IP实现来说FTP服务器的TCP端口号就是21每个Talnet服务器的TCP端口号都是23每个TFTP简单文件传送协议服务器的UDP端口号都是69. 数据交流 当涉及到数据交流的时候就会涉及到协议说白了就是数据格式例如http超文本传输协议是一个简单的请求-响应协议它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣因为它使开发和部署非常地直截了当。、tcp传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议由IETF的RFC 793定义。、udpInternet 协议集支持一个无连接的传输协议该协议称为用户数据报协议UDPUser Datagram Protocol。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768描述了 UDP。 socket套接字 所谓套接字(Socket)就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲套接字上联应用进程下联网络协议栈是应用程序通过网络协议进行通信的接口是应用程序与网络协议根进行交互的接口。所谓socket网络编程也叫作套接字网络编程套接字网络编程用到的协议TCP协议和UDP协议的用的比较多。 TCP和UDP协议的区别 连接方面区别TCP提供面向连接的传输通信前要先建立连接三次握手机制如打电话要先拨号建立连接。UDP是无连接的,面向报文的即发送数据之前不需要建立连接。安全方面的区别TCP提供可靠的服务通过TCP连接传送的数据无差错不丢失不重复且按序到达。UDP尽最大努力交付即不保证可靠交付。传输效率的区别TCP传输效率相对较低。UDP传输效率高适用于对高速传输和实时性有较高的通信或广播通信。连接对象数量的区别TCP连接只能是点到点、一对一的。UDP支持一对一一对多多对一和多对多的交互通信。TCP首部开销20字节UDP的首部开销小只有8个字节 字节序 字节序即字节在电脑中存放时的序列与输入输出时的序列是先到的在前还是后到的在前。计算机硬件有两种储存数据的方式大端字节序big endian和小端字节序little endian。 为什么会有小端字节序 计算机电路先处理低位字节效率比较高因为计算都是从低位开始的。所以计算机的内部处理都是小端字节序。但是人类还是习惯读写大端字节序。所以除了计算机的内部处理其他的场合几乎都是大端字节序比如网络传输和文件储存。 常见序 Little endian小端字节序将低序字节存储在起始地址Big endian大端字节序将高序字节存储在起始地址网络协议指定了通讯字节序—大端只有在多字节数据作为整体处理时才需要考虑字节序运行在同一台计算机上的进程相互通信时,一般不用考虑字节序异构计算机之间通讯需要转换自己的字节序为网络字节序 什么是高低位: 给一个十进制整数123456很明显左边的是高位右边的是低位。计算机也是这样认为的。给一个16进制数(四个二进制表示)0x12345678以字节为单位从高位到低位依次是 0x12、0x34、0x56、0x78。例子在内存中双字0x01020304(DWORD)的存储方式 地址从低到高4000-4001-4002-4003 小端字节序 04 03 02 01 大端字节序01 02 03 04 socket编程步骤 可以把服务器与客户端之间的场景看做以下场景一个客户端走到五座房子5个服务器的面前要访问这五座房子中的一座房子中的一间房间。当客户端不知道去哪一间房子时这时候有一个人在楼上喊我是说汉语的TCP/UDP服务器我的楼号是…IP地址我的房间号是…(端口号)然后客户端就可以获取服务器IP和服务器端口号进行连接。 服务器端创建步骤 服务器端创建套接字socket函数返回网络描述符后续用网络描述符进行操作bind()为套接字添加信息指定服务器自己的IP地址和端口号监听网络连接listen()函数监听到有客户端接入接收一个连接accept()函数数据交互利用read函数从网络上面读数据利用write函数向网络上面写数据关闭套接字close()函数断开连接 客户端创建步骤 socket()创建一个通道connect()连接服务器根据IP地址和端口号然后进行读写操作最后关闭套接字断开连接 三次握手和一次挥手 当客户端调用connect时触发了连接请求向服务器发送了SYN J包这时connect进入阻塞状态服务器监听到连接请求即收到SYN J包调用accept函数接收请求向客户端发送SYN K ACK J1这时accept进入阻塞状态客户端收到服务器的SYN K ACK J1之后这时connect返回并对SYN K进行确认服务器收到ACK K1时accept返回至此三次握手完毕连接建立。 socket编程函数介绍 socket()函数 #includesys/types.h #includesys/socket.h int socket(int domain, int type, int protocol); 功能这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。参数domain函数socket()的参数domain用于设置网络通信的域函数socket()根据这个参数选择通信协议的族通常为AF_INET表示互联网协议族TCP/IP协议族。通信协议族在文件sys/socket.h中定义。协议族决定了socket的地址类型在通信中必须采用对应的地址domain的值及含义AF_INET、PF_INET IPV4因特网域AF_INET6 IPV6因特网域AF_UNIX: Unix域AF_ROUTE: 路由套接字AF_KEY: 密钥套接字AF_UNSPEC: 未指定PF_UNIX,PF_LOCAL 本地通信type指定socket类型常用的socket类型有SOCK_STREAM Tcp连接提供序列化的、可靠的、双向连接的字节流使用TCP协议。支持带外数据传输SOCK_DGRAM 数据报套接字定义了一种无连接的报数据通过相互独立的报文件进行传输是无序的并且不保证是可靠的、无差错的、使用数据报协议UDP连接无连接状态的消息SOCK_RAW RAW类型允许程序使用底层协议原始套接字允许对底层协议如IP/ICMP进行直接访问功能强大但使用较为不便主要用于协议的开发SOCK_PACKET: 这是一个专用类型不能呢过在通用程序中使用SOCK_SEQPACKET:序列化包提供一个序列化的、可靠的、双向的基本连接的数据传输通道数据长度定常。每次调用读系统调用时数据需要将全部数据读出protocol故名思意就是指定协议.常用的协议有:IPPROTO_TCP:TCP传输协议IPPTOTO_UDP:UDP传输协议IPPROTO_SCTP:STCP传输协议IPPROTO_TIPC:TIPC传输协议返回值如果函数调用成功会返回一个标识这个套接字的文件描述符失败的时候返回-1。 注意 并不是上面的type和protocol可以随意组合的如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时会自动选择type类型对应的默认协议。当我们调用socket创建一个socket时返回的socket描述字它存在于协议族address familyAF_XXX空间中但没有一个具体的地址。如果想要给它赋值一个地址就必须调用bind()函数否则就当调用connect()、listen()时系统会自动随机分配一个端口。 bind()函数 #includesys/types.h #includesys/socket.h int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。参数sockfd即socket描述字它是通过socket()函数创建了唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。addr一个const struct sockaddr *指针指向要绑定给sockfd的协议地址这个地址结构根据地址创建socket时的地址协议族的不同而不同。如ipv4对应的是 struct sockaddr{unsigned short as_familf;//协议族char sa_data[14];//IP端口号}同等替换为使用时强转(struct sockaddr *)my_addr struct sockaddr_in {sa_family_t sin_family; /* 协议族: AF_INET */in_port_t sin_port; /* 端口号一般用5000以上低于3000的是操作系统的关键端口这个要将它转化为网络字节序*/struct in_addr sin_addr; /* IP地址结构体*/unsigned char sin_zero[8]/*填充没有实际意义只是为跟sockaddr结构体在内存中对齐这样两者才能相互转换*/};/* Internet address. */struct in_addr {uint32_t s_addr; /* address in network byte order */};ipv6对应的是 struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* port number */ uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */ };struct in6_addr { unsigned char s6_addr[16]; /* IPv6 address */ };Unix域对应的是 #define UNIX_PATH_MAX 108struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* pathname */ };addrlen对应的是地址的长度结构体大小。返回值bind()函数的返回值为0时表示绑定成功-1表示绑定失败通常服务器在启动的时候都会绑定一个众所周知的地址如ip地址端口号用于提供服务客户就可以通过它来接连服务器而客户端就不用指定有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind()而客户端就不会调用而是在connect()时由系统随机生成一个。在将一个地址绑定到socket的时候请先将主机字节序转换成为网络字节序而不要假定主机字节序跟网络字节序一样使用的是Big-Endian。请谨记对主机字节序不要做任何假定务必将其转化为网络字节序再赋给socket。 IP地址转换API 旧版本 #include sys/socket.h #include netinet/in.h #include arpa/inet.h int inet_aton(const char *cp, struct in_addr *inp); 功能将点分十进制IP转化为网络字节序存放在addr中并返回该网络字节序对应的整数。 参数输入参数cp包含ASCII表示的IP地址。输出参数inp是将要用新的IP地址更新的结构。 返回值如果这个函数成功函数的返回值非零。如果输入地址不正确则会返回零。使用这个函数并没有错误码存放在errno中所以他的值会被忽略。in_addr_t inet_addr(const char *cp); 功能将点分十进制IP转化为网络字节序二进制位的大端存储。 返回值如果失败返回INADDR_NONE如果成功返回IP对应的网络字节序的数char *inet_ntoa(struct in_addr in); 功能把网络格式的ip地址转化为字符串形式 inet_network函数in_addr_t inet_network(const char *StrIP) 功能 将点分十进制IP转化为主机字节序二进制位小端存储。 返回值如果失败返回-1如果成功返回主机字节序对应的数 旧版本的只能处理IPv4的ip地址 不可重入函数 注意参数是struct in_addr新版本 #include arpa/inet.h int inet_pton(int af, const char *src, void *dst); const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 新版本的支持IPv4和IPv6 可重入函数 其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr 还可以转换IPv6的in6_addr因此函数接口是void *addrptr。listen()、connect()函数 如果作为一个服务器在调用socket()、bind()之后就会调用listen()来监听这个socket如果客户端这时调用connect()发出连接请求服务器端就会接收到这个请求。 #includesys/types.h #includesys/socket.h int listen(int sockfd, int backlog); int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能内核为任何一个给定监听者套接字维护两个队列1、未完成队列每个这样的SYN报文段对应其中一项已由某个客户端发出并到达服务器而服务器正在等待相应的TCP三次握手过程这些套接字处于SYN_REVD状态2、已完成队列每个已完成TCP三次握手过程的客户端对应其中一项这些套接字处于ESTABLISHED状态。参数listen函数的第一个参数即为要监听的socket描述字服务器的描述字第二个参数为相应socket可以排队的最大连接个数。listen并未开始连线只是设置socket的listen模式。listen函数只用于服务器端。socket()函数创建的socket默认是一个主动类型的listen函数将socket变为被动类型的等待客户的连接请求。connect函数的第一个参数即为客户端的socket描述字第二参数为服务器的socket地址第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。返回值listen函数成功返回0 失败返回-1.connect函数成功返回0 失败返回-1.accept()函数 TCP服务器端依次调用socket()、bind()、listen()之后就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后就会调用accept()函数取接收请求这样连接就建立好了。之后就可以开始网络I/O操作了即类同于普通文件的读写I/O操作。 #includesys/types.h #includesys/socket.h int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 参数accept函数的第一个参数为服务器的socket描述字第二个参数为指向struct sockaddr *的指针用于返回客户端的协议地址不关心可以设置为NULl。第三个参数为协议地址的长度。返回值如果accpet成功那么其返回值是由内核自动生成的一个全新的描述字代表与返回客户的TCP连接。失败时返回-1注意 accept的第一个参数为服务器的socket描述字是服务器开始调用socket()函数生成的称为监听socket描述字而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字当服务器完成了对某个客户的服务相应的已连接socket描述字就被关闭。 数据的收发 一般用read/write函数当然还有其他函数 read/writerecv()/send()readv()/writev()recvmsg()/sendmsg()多在UDP连接时使用recvfrom()/sendto()多在UDP连接时使用 #include unistd.h ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);#include sys/types.h #include sys/socket.h ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);recv()/send()函数 close()函数 在服务器与客户端建立连接之后会进行一些读写操作完成了读写操作就要关闭相应的socket描述字好比操作完打开的文件要调用fclose关闭打开的文件。 #include unistd.h int close(int fd);close一个TCP socket的缺省行为时把该socket标记为以关闭 然后立即返回到调用进程。该描述字不能再由调用进程使用 也就是说不能再作为read或write的第一个参数。注意close操作只是使相应socket描述字的引用计数-1只有当引用计数为0的时候才会触发TCP客户端向服务器发送终止连接请求。网络字节序和主机字节序的转换 #include arpa/inet.h uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); h表示hostn表示networkl表示32位长整数s表示16位短整数。 如果主机是小端字节序这些函数将参数做相应的大小端转换然后返回 如果主机是大端字节序这些函数不做转换将参数原封不动地返回。服务端实现可被连接功能 #includestdio.h #include sys/types.h #include sys/socket.h #include unistd.h //#includelinux/in.h 头文件之间可能造成冲突这个头文件就和#include arpa/inet.h冲突 #include arpa/inet.h #includestdlib.h #includestring.h #include sys/wait.h #includepthread.h struct num {int fd;char*write; }; void* writeMsg(void*arg) {int i;struct num Part;Part.write((struct num*)arg)-write;Part.fd((struct num*)arg)-fd;while(1){if(i1){getchar();}i1;memset(Part.write,\0,128);printf(输入要给客户端的内容:\n);scanf(%[^\n],Part.write);write(Part.fd,Part.write,128);} } int main() {struct sockaddr_in IP;struct sockaddr_in CLI;//客户端信息struct num CAN;int socketre;int bindre;int i0;int newfd;pid_t fpid;pthread_t sontd;char* writebuf;char* readbuf;readbuf(char*)malloc(128);writebuf(char*)malloc(128);int lensizeof(struct sockaddr_in);socketresocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(socketre-1){printf(create fail\n);perror(socket);exit(-1);}memset(IP,\0,len);memset(CLI,\0,len);IP.sin_familyAF_INET;IP.sin_porthtons(8686);IP.sin_addr.s_addrinet_addr(192.168.1.183);bindrebind(socketre,(struct sockaddr*)IP,len);if(bindre-1){perror(bind);printf(bind fail\n);exit(-1);}listen(socketre,10);while(1){newfdaccept(socketre,(struct sockaddr*)CLI,len);if(newfd-1){perror(accept);printf(accept fail\n);exit(-1);}printf(连接成功\n);printf(get client:%s\n,inet_ntoa(CLI.sin_addr));CAN.writewritebuf;CAN.fdnewfd;fpidfork();if(fpid0){pthread_create(sontd,NULL,writeMsg,(void*)CAN);while(1){memset(readbuf,\0,128);if(read(newfd,readbuf,128)!0){if(strcmp(readbuf,quit)0){write(newfd,server is out,13);close(newfd);pthread_cancel(sontd);break;}printf(接受到消息:%s\n,readbuf);printf(输入要给客户端的内容:\n);}else{printf(与客户端断开连接\n);}}}if(fpid0){waitpid(fpid,NULL,WNOHANG | WUNTRACED);}}return 0; } 如果有手机的话可以下载TCP手机助手进行连接服务器没有该软件可以用以下客户端代码 #includestdio.h #includestdlib.h #includestring.h #includesys/types.h #includesys/socket.h #include unistd.h #include arpa/inet.h #includepthread.h struct Client {char* write;int fd; }; void* del(void*arg) {struct Client CAN;CAN.write((struct Client*)arg)-write;CAN.fd((struct Client*)arg)-fd;while(1){memset(CAN.write,\0,128);printf(请输入要发送给服务端的消息:\n);scanf(%s,CAN.write);write(CAN.fd,CAN.write,strlen(CAN.write));} } int main() {int socketfd;int conre;char*writebuf;char*readbuf;pthread_t th;struct Client CL;struct sockaddr_in addr;addr.sin_familyAF_INET;addr.sin_porthtons(8686);addr.sin_addr.s_addrinet_addr(192.168.1.183);socketfdsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(socketfd-1){printf(socket create fail\n);perror(socket);exit(-1);}conreconnect(socketfd,(struct sockaddr*)addr,sizeof(struct sockaddr_in));if(conre-1){printf(connect fail\n);perror(connect);exit(-1);}writebuf(char*)malloc(128);readbuf(char*)malloc(128);CL.writewritebuf;CL.fdsocketfd;pthread_create(th,NULL,del,(void*)CL);while(1){memset(readbuf,\0,128);read(socketfd,readbuf,128);printf(获取到服务端数据:%s\n,readbuf);printf(请输入要发送给服务端的消息:\n);}return 0; }补充 当我们想用一个结构体或者联合体时可以进入/usr/include/这个文件夹下面查找看看头文件里面有没有包含想要使用的结构体或者联合体使用以下命令 cd /usr/include/ 进入文件夹 grep struct sockaddr_in { * -nir grep表示查找双引号内的东西是你要查找的内容的一部分 *表示在当前目录下。-nir中 n表示显示行号i表示不区分大小写r表示逐行扫描 linux/in.h:232:struct sockaddr_in { 得到结果232表示行号linux/in.h表示所在文件夹 vi linux/in.h 232 这个命令是直接打开定位到该文件的232行。linux查看端口号占用命令-netstat netstat -pan | grep 5623 #其中5623位端口号如图可以看到占用该端口号的进程并且可以利用ps指令找到程序名称。 判断socket有没有与客户端断开连接 本文参照博客socket编程
http://www.zqtcl.cn/news/131504/

相关文章:

  • 如何进入网站管理页面维护网站需要多少钱
  • 深圳住房和城乡建设局网站阿里云学生免费服务器
  • 如何做的网站手机可以用吗绵阳优化网站排名
  • 营销网站建设大全wordpress wp_register
  • 公司做年审在哪个网站网络seo专员招聘
  • 宿州网站建设费用网站快速建设入门教程
  • 怎么自己做网站加盟网站建设意义模板
  • 网站开发怎样实现上传视频教程内容导购网站模板
  • 济南做网站建设的公司广告公司资质
  • 域名分类网站微擎 wordpress
  • 公司产品营销策划安徽seo
  • 网站 平均加载时间百度搜索竞价推广
  • 赛车网站开发淄博网站建设及托管
  • 过时的网站湖州公司网站建设
  • 环球设计网站网站建设的面试要求
  • 百度公司网站排名怎么做潮阳网站开发
  • 杨和网站建设国内外建筑设计网站
  • 北京知名网站建设公司wordpress4.0.x 下载
  • 锡盟网站建设做网站视频存储
  • 深圳博纳网站建设高端品牌护肤品排行榜
  • 百度爱采购优化排名软件宁波seo搜索平台推广专业
  • 门户网站的建设公司台山网站定制
  • 建设公司网站需要什么群辉nas怎么做网站
  • 广西自治区集约化网站建设要求坂田网站的建设
  • 网站后台不能编辑企业如何申请网站
  • 网站建设网站设计多少钱网站系统开发方式
  • 站长收录wordpress配置好后别人无法访问
  • 我国档案网站建设吉林网站建设制作
  • 手机网站底部导航网站视频链接怎么做
  • 企业门户网站属于什么层seo关键词排行优化教程