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

义乌网站开发公司公司建设网站算入什么会计科目

义乌网站开发公司,公司建设网站算入什么会计科目,wordpress相册新窗口,网站建设 空间什么系统1. socket // 套接字通信分两部分#xff1a; - 服务器端#xff1a;被动接受连接#xff0c;一般不会主动发起连接 - 客户端#xff1a;主动向服务器发起连接 2.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时#xff0c;接收端必然错误…  1. socket  // 套接字通信分两部分 - 服务器端被动接受连接一般不会主动发起连接 - 客户端主动向服务器发起连接 2.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时接收端必然错误的解释之。解决问题的方法是发送端总是把要发送的数据转换成大端字节序数据后再发送而接收端知道对方传送过来的数据总是采用大端字节序所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换小端机转换大端机不转换。 网络字节顺序是 TCP/IP 中规定好的一种数据表示格式它与具体的 CPU 类型、操作系统等无关从而 可以保证数据在不同主机之间传输时能够被正确解释网络字节顺序采用大端排序方式。 BSD Socket提供了封装好的转换接口方便程序员使用。包括从主机字节序到网络字节序的转换函数 htons、htonl从网络字节序到主机字节序的转换函数ntohs、ntohl。 h - host 主机主机字节序 to - 转换成什么 n - network 网络字节序 s - short unsigned short l - long unsigned int #include arpa/inet.h // 转换端口 uint16_t htons(uint16_t hostshort); // 主机字节序 - 网络字节序 uint16_t ntohs(uint16_t netshort); // 网络字节序 - 主机字节序 // 转IP uint32_t htonl(uint32_t hostlong); // 主机字节序 - 网络字节序 uint32_t ntohl(uint32_t netlong); // 网络字节序 - 主机字节序 3. socket 地址 // socket地址其实是一个结构体封装端口号和IP等信息。后面的socket相关的api中需要 // 使用到这个socket地址。 // 客户端 - 服务器IP, Port 通用 socket 地址 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr其定义如下 #include bits/socket.h struct sockaddr {sa_family_t sa_family;char sa_data[14]; }; typedef unsigned short int sa_family_t; sa_family 成员是地址族类型sa_family_t的变量。地址族类型通常与协议族类型对应。常见的协议族protocol family也称 domain和对应的地址族入下所示  宏 PF_* 和 AF_* 都定义在 bits/socket.h 头文件中且后者与前者有完全相同的值所以二者通常混用。 sa_data 成员用于存放 socket 地址值。但是不同的协议族的地址值具有不同的含义和长度如下所示 由上表可知14 字节的 sa_data 根本无法容纳多数协议族的地址值。因此Linux 定义了下面这个新的通用的 socket 地址结构体这个结构体不仅提供了足够大的空间用于存放地址值而且是内存对齐的。 #include bits/socket.h struct sockaddr_storage {sa_family_t sa_family;unsigned long int __ss_align;char __ss_padding[ 128 - sizeof(__ss_align) ]; }; typedef unsigned short int sa_family_t; 专用 socket 地址 很多网络编程函数诞生早于 IPv4 协议那时候都使用的是 struct sockaddr 结构体为了向前兼容现在sockaddr 退化成了void *的作用传递一个地址给函数至于这个函数是 sockaddr_in 还是 sockaddr_in6由地址族确定然后函数内部再强制类型转化为所需的地址类型。 UNIX 本地域协议族使用如下专用的 socket 地址结构体 #include sys/un.h struct sockaddr_un {sa_family_t sin_family;char sun_path[108]; }; TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用的 socket 地址结构体它们分别用于 IPv4 和 IPv6 #include netinet/in.h struct sockaddr_in {sa_family_t sin_family; /* __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 in_addr {in_addr_t s_addr; }; struct sockaddr_in6 {sa_family_t sin6_family;in_port_t sin6_port; /* Transport layer port # */uint32_t sin6_flowinfo; /* IPv6 flow information */struct in6_addr sin6_addr; /* IPv6 address */uint32_t sin6_scope_id; /* IPv6 scope-id */ }; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef uint16_t in_port_t; typedef uint32_t in_addr_t; #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) 所有专用 socket 地址以及 sockaddr_storage类型的变量在实际使用时都需要转化为通用 socket 地址类型 sockaddr强制转化即可因为所有 socket 编程接口使用的地址参数类型都是 sockaddr。 4. IP地址转换字符串ip-整数 主机、网络 字节序的转换 通常人们习惯用可读性好的字符串来表示 IP 地址比如用点分十进制字符串表示 IPv4 地址以及用 十六进制字符串表示 IPv6 地址。但编程中我们需要先把它们转化为整数二进制数方能使用。而记录日志时则相反我们要把整数表示的 IP 地址转化为可读的字符串。下面 3 个函数可用于用点分十进制字 符串表示的 IPv4 地址和用网络字节序整数表示的 IPv4 地址之间的转换 #include arpa/inet.h in_addr_t inet_addr(const char *cp); int inet_aton(const char *cp, struct in_addr *inp); char *inet_ntoa(struct in_addr in); 下面这对更新的函数也能完成前面 3 个函数同样的功能并且它们同时适用 IPv4 地址和 IPv6 地址 #include arpa/inet.h // p:点分十进制的IP字符串n:表示network网络字节序的整数 int inet_pton(int af, const char *src, void *dst);af:地址族 AF_INET AF_INET6src:需要转换的点分十进制的IP字符串dst:转换后的结果保存在这个里面// 将网络字节序的整数转换成点分十进制的IP地址字符串 const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);af:地址族 AF_INET AF_INET6src: 要转换的ip的整数的地址dst: 转换成IP地址字符串保存的地方size第三个参数的大小数组的大小返回值返回转换后的数据的地址字符串和 dst 是一样的 5. TCP通信流程 // TCP 和 UDP - 传输层的协议 UDP:用户数据报协议面向无连接可以单播多播广播 面向数据报不可靠 TCP:传输控制协议面向连接的可靠的基于字节流仅支持单播传输UDP TCP 是否创建连接 无连接 面向连接 是否可靠 不可靠 可靠的 连接的对象个数 一对一、一对多、多对一、多对多 支持一对一 传输的方式 面向数据报 面向字节流 首部开销 8个字节 最少20个字节 适用场景 实时应用视频会议直播 可靠性高的应用文件传输 // TCP 通信的流程 // 服务器端 被动接受连接的角色 1. 创建一个用于监听的套接字- 监听监听有客户端的连接- 套接字这个套接字其实就是一个文件描述符 2. 将这个监听文件描述符和本地的IP和端口绑定IP和端口就是服务器的地址信息- 客户端连接服务器的时候使用的就是这个IP和端口 3. 设置监听监听的fd开始工作 4. 阻塞等待当有客户端发起连接解除阻塞接受客户端的连接会得到一个和客户端通信的套接字 fd 5. 通信- 接收数据- 发送数据 6. 通信结束断开连接 // 客户端 1. 创建一个用于通信的套接字fd 2. 连接服务器需要指定连接的服务器的 IP 和 端口 3. 连接成功了客户端可以直接和服务器通信- 接收数据- 发送数据 4. 通信结束断开连接 6. 套接字函数 #include sys/types.h #include sys/socket.h #include arpa/inet.h // 包含了这个头文件上面两个就可以省略 int socket(int domain, int type, int protocol);- 功能创建一个套接字- 参数- domain: 协议族AF_INET : ipv4AF_INET6 : ipv6AF_UNIX, AF_LOCAL : 本地套接字通信进程间通信- type: 通信过程中使用的协议类型SOCK_STREAM : 流式协议SOCK_DGRAM : 报式协议- protocol : 具体的一个协议。一般写0- SOCK_STREAM : 流式协议默认使用 TCP- SOCK_DGRAM : 报式协议默认使用 UDP- 返回值- 成功返回文件描述符操作的就是内核缓冲区。- 失败-1int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // socket命 名- 功能绑定将fd 和本地的IP 端口进行绑定- 参数- sockfd : 通过socket函数得到的文件描述符- addr : 需要绑定的socket地址这个地址封装了ip和端口号的信息- addrlen : 第二个参数结构体占的内存大小int listen(int sockfd, int backlog); // /proc/sys/net/core/somaxconn- 功能监听这个socket上的连接- 参数- sockfd : 通过socket()函数得到的文件描述符- backlog : 未连接的和已经连接的和的最大值 5int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);- 功能接收客户端连接默认是一个阻塞的函数阻塞等待客户端连接- 参数- sockfd : 用于监听的文件描述符- addr : 传出参数记录了连接成功后客户端的地址信息ipport- addrlen : 指定第二个参数的对应的内存大小- 返回值- 成功 用于通信的文件描述符- 失败 -1int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);- 功能 客户端连接服务器- 参数- sockfd : 用于通信的文件描述符- addr : 客户端要连接的服务器的地址信息- addrlen : 第二个参数的内存大小- 返回值成功 0 失败 -1//读写数据 ssize_t write(int fd, const void *buf, size_t count); // 写数据 ssize_t read(int fd, void *buf, size_t count); // 读数据 7.SIGCHLD信号 SIGCHLD的产生条件 子进程终止子进程接收到SIGSTOP信号停止时子进程处于停止状态接收到SIGCONT后唤醒 注意通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心由内核回收。如果不想让父进程挂起可以在父进程中加入一条语句signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号该信号是子进程退出的时候向父进程发送的。 基于linux下的高并发服务器开发第二章- 2.27 SIGCHLD 信号_呵呵哒(▽)的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/131859897?spm1001.2014.3001.5501 8.案例多进程实现并发服务器 多进程实现并发服务器_多进程并发服务器_Neo_21的博客-CSDN博客https://blog.csdn.net/Neo_21/article/details/129224851 多线程实现并发服务器 以下思路和文字总结来自爱编程的大丙服务器并发 | 爱编程的大丙 (subingwen.cn) 如果要编写多进程版的并发服务器程序首先要考虑创建出的多个进程都是什么角色这样就可以在程序中对号入座了。在Tcp服务器端一共有两个角色分别是监听和通信监听是一个持续的动作如果有新连接就建立连接如果没有新连接就阻塞。关于通信是需要和多个客户端同时进行的因此需要多个进程这样才能达到互不影响的效果。进程也有两大类父进程和子进程通过分析我们可以这样分配进程 父进程 负责监听处理客户端的连接请求也就是在父进程中循环调用accept()函数创建子进程建立一个新的连接就创建一个新的子进程让这个子进程和对应的客户端通信回收子进程资源子进程退出回收其内核PCB资源防止出现僵尸进程子进程负责通信基于父进程建立新连接之后得到的文件描述符和对应的客户端完成数据的接收和发送。 发送数据send() / write()接收数据recv() / read() 在多进程版的服务器端程序中多个进程是有血缘关系对应有血缘关系的进程来说还需要想明白他们有哪些资源是可以被继承的哪些资源是独占的以及一些其他细节 子进程是父进程的拷贝在子进程的内核区PCB中文件描述符也是可以被拷贝的因此在父进程可以使用的文件描述符在子进程中也有一份并且可以使用它们做和父进程一样的事情。 父子进程有用各自的独立的虚拟地址空间因此所有的资源都是独占的 为了节省系统资源对于只有在父进程才能用到的资源可以在子进程中将其释放掉父进程亦如此。 由于需要在父进程中做accept()操作并且要释放子进程资源如果想要更高效一下可以使用信号的方式处理 server_process.c #include stdio.h #include arpa/inet.h #include unistd.h #include stdlib.h #include string.h #include signal.h #include wait.h #include errno.hvoid recyleChild(int arg) {// 回收子进程PCB的资源while(1) {int ret waitpid(-1, NULL, WNOHANG);if(ret -1) {// 所有的子进程都回收了break;}else if(ret 0) {// 还有子进程活着break;} else if(ret 0){// 被回收了printf(子进程 %d 被回收了\n, ret);}} }int main() {// 捕捉子进程死亡时发送的SIGCHLD信号struct sigaction act;act.sa_flags 0;act.sa_handler recyleChild; sigemptyset(act.sa_mask);// 清空临时阻塞信号集// 注册信号捕捉sigaction(SIGCHLD, act, NULL);// 创建socketint lfd socket(PF_INET, SOCK_STREAM, 0);if(lfd -1){perror(socket);exit(-1);}struct sockaddr_in saddr;saddr.sin_family AF_INET;saddr.sin_port htons(9999);saddr.sin_addr.s_addr INADDR_ANY;// 绑定int ret bind(lfd,(struct sockaddr *)saddr, sizeof(saddr));if(ret -1) {perror(bind);exit(-1);}// 监听ret listen(lfd, 128);if(ret -1) {perror(listen);exit(-1);}// 不断循环等待客户端连接while(1) {struct sockaddr_in cliaddr;int len sizeof(cliaddr);// 接受连接int cfd accept(lfd, (struct sockaddr*)cliaddr, len);if(cfd -1) {if(errno EINTR) {continue;}perror(accept);exit(-1);}// 每一个连接进来创建一个子进程跟客户端通信pid_t pid fork();if(pid 0) {// 子进程// 获取客户端的信息char cliIp[16];inet_ntop(AF_INET, cliaddr.sin_addr.s_addr, cliIp, sizeof(cliIp));unsigned short cliPort ntohs(cliaddr.sin_port);printf(client ip is : %s, prot is %d\n, cliIp, cliPort);// 接收客户端发来的数据char recvBuf[1024];while(1) {int len read(cfd, recvBuf, sizeof(recvBuf));if(len -1) {perror(read);exit(-1);}else if(len 0) {printf(recv client : %s\n, recvBuf);} else if(len 0) {printf(client closed....\n);break;}write(cfd, recvBuf, strlen(recvBuf) 1);}close(cfd);exit(0); // 退出当前子进程}}close(lfd);return 0; } client.c // TCP通信的客户端 #include stdio.h #include arpa/inet.h #include unistd.h #include string.h #include stdlib.hint main() {// 1.创建套接字int fd socket(AF_INET, SOCK_STREAM, 0);if(fd -1) {perror(socket);exit(-1);}// 2.连接服务器端struct sockaddr_in serveraddr;serveraddr.sin_family AF_INET;inet_pton(AF_INET, 192.168.193.128, serveraddr.sin_addr.s_addr);serveraddr.sin_port htons(9999);int ret connect(fd, (struct sockaddr *)serveraddr, sizeof(serveraddr));if(ret -1) {perror(connect);exit(-1);}// 3. 通信char recvBuf[1024];int i 0;while(1) {sprintf(recvBuf, data : %d\n, i);// 给服务器端发送数据write(fd, recvBuf, strlen(recvBuf)1);int len read(fd, recvBuf, sizeof(recvBuf));if(len -1) {perror(read);exit(-1);} else if(len 0) {printf(recv server : %s\n, recvBuf);} else if(len 0) {// 表示服务器端断开连接printf(server closed...);break;}sleep(1);}// 关闭连接close(fd);return 0; } 运行效果 其中SIGCHLD可以解决这个问题
http://www.hkea.cn/news/14514960/

相关文章:

  • 丹徒网站建设信息jsp网站建设项目实践
  • 邯郸网站制作个人小鸟云服务器官网
  • 网站建设实验报告模板国内有做网游评测的网站么
  • 财经那个网站做的好网站开发的目的 实习报告
  • 青海省建设厅建管处网站做kegg通路富集的网站
  • 网站与客户互动从用户旅程角度做网站分析
  • 响应式网站建设软文网络营销核心要素
  • 巴中市建设局网站恩施做网站多少钱
  • 初中生如何做网站做设计必看十大网站
  • 网站手机版二维码怎么做做外贸是在什么网站
  • 企业网站建设劣势seo的优点和缺点
  • 外贸网站源码多语言刷会员网站怎么做
  • 制作企业网站新闻列表页面网页设计实训报告公众号引流推广平台
  • 自己做的网站可以运营不微网站 微信
  • 使用vue做的购物网站wordpress登录验证失败
  • 百度推广官网网站郑州网站模板
  • 做网站的图片大小是多少系统开发策略主要有
  • 网站怎么做支付wordpress自定义DIV样式
  • 做网站首页置顶多少钱小制作废品利用
  • 手机网站开发 c平台设计图片
  • 网站建设教学大纲网站关键词在哪里修改
  • 建设银行官方网站首页品牌网站建设内容框架
  • 网站系统建设项目h5建站工具
  • 类似美团的网站建设做网站内存最小源码
  • 中国建设银行网站宁波网点网页上传 网站
  • 纺织网站模板wordpress建站小百科
  • 哪些网站上可以做seo推广的12306网站开始是谁开发的
  • 无锡网站制作优化排名网站建设方法有那几种
  • 全屏类网站代理建设网站
  • 微网站自己怎么做网站设计定做