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

企石镇网站建设公司代理公司收费标准

企石镇网站建设公司,代理公司收费标准,河南seo快速排名,如何优化网站图片服务端流程步骤socket函数创建监听套接字lfdbind函数将监听套接字绑定ip和端口listen函数设置服务器为被动监听状态#xff0c;同时创建一条未完成连接队列#xff08;没走完tcp三次握手流程的连接#xff09;#xff0c;和一条已完成连接队列#xff08;已完成tcp三次握手…服务端流程步骤socket函数创建监听套接字lfdbind函数将监听套接字绑定ip和端口listen函数设置服务器为被动监听状态同时创建一条未完成连接队列没走完tcp三次握手流程的连接和一条已完成连接队列已完成tcp三次握手的连接accept函数循环的从已完成连接队列中提取连接并返回一个新的套接字cfd跟客户端进行通信fork函数创建一个子进程让子进程与客户端进行通信子进程read函数循环的从r缓冲区读取客户端发送的数据write函数将要发送的数据写入w缓冲区close函数关闭套接字客户端流程步骤socket函数创建套接字connect函数连接服务器write函数将要发送的数据写入w缓冲区read函数从r缓冲区读取服务器发送给客户端的数据close函数关闭套接字客户端跟服务器通信流程图相关函数int socket(int domain, int type, int protocol); 功能创建一个用于网络通信的套接字文件描述符 参数domain协议族AF_INETipv4AF_INET6ipv6等等 type套接字类型SOCK_DGRAMudpSOCK_STREAMtcp等等 protocol用于制定某个协议的特定类型即type类型中的某个类型通常不用管它设置 为 0返回值成功则返回socket套接字描述符, 失败返回-1并设置errno头文件#include sys/socket.hint bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); 功能将sockfd绑定ip和端口 参数sockfd套接字 my_addr存放有协议ip端口的结构体信息 addrlenmy_addr结构体大小返回值成功返回0失败返回-1并设置errno头文件#include sys/types.h #include sys/socket.hint listen(int s, int backlog); 功能让服务器处于被动监听状态同时创建了一条未完成三次握手的连接队列和一条已经完成三次握 手的连接队列 参数s套接字 backlog支持未完成连接和已完成连接之和的最大值一般设置128返回值成功返回0失败返回-1并设置errno头文件#include sys/socket.hint accept(int s, struct sockaddr *addr, socklen_t *addrlen); 功能从已完成连接队列中提取客户端连接 参数s套接字 addr存放成功连接的客户端的ip端口等信息结构体 addrlen存放addr结构体大小的变量地址返回值成功则返回一个非负整数标识这个连接套接字是否返回-1头文件#include sys/types.h #include sys/socket.hssize_t read(int fd, void *buf, size_t count); 功能从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中 参数fd文件描述符 buf缓冲区 count读count字节返回值成功时返回读取到的字节数失败返回-1并设置errno头文件#include unistd.hssize_t write(int fd, const void *buf, size_t count); 功能向文件描述符fd所引用的文件中写入从buf开始的缓冲区中count字节的数据 参数fd文件描述符 buf缓冲区 count写count字节返回值功时返回所写入的字节数失败返回-1并设置errno头文件#include unistd.hint close(int fd); 功能关闭 一个文件描述符 参数fd要关闭的文件描述符返回值成功返回0失败返回-1并设置errno头文件#include unistd.hint connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能连接服务器 参数sockfd套接字 addr服务器的ip端口等结构体信息 addrlenaddr结构体大小返回值成功返回0失败返回-1并设置errno头文件#include sys/socket.hpid_t fork(void); 功能创建一个子进程 参数无返回值父进程返回子进程的进程id子进程返回0头文件#include unistd.hint sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 功能设置信号集屏蔽字 参数howSIG_BLOCK mask | setSIG_UNBLOCK mask ~setSIG_SETMASK mask set set信号集 oldset旧的信号集返回值成功返回0失败返回-1并设置errno头文件#include signal.hpid_t waitpid(pid_t pid, int *status, int options); 功能回收已结束的子进程资源 参数pidpid-1 等待进程组识别码为pid绝对值的任何子进程 pid-1 等待任何子进程, 相当于wait() pid0 等待进程组识别码与目前进程相同的任何子进程 pid0 等待任何子进程识别码为pid的子进程 status子进程的结束状态值 optionsWNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待 WUNTRACED 如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会返回值成功返回子进程pid失败返回-1头文件 #include sys/types.h #include sys/wait.h服务端代码#include stdio.h #include sys/socket.h #include arpa/inet.h #include string.h #include unistd.h #include signal.h #include stdlib.h #include sys/types.h #include sys/wait.h #include errno.h#define BUF_SIZE 256void do_sigchld(int signo, siginfo_t *siginfo, void *p) {int status;pid_t pid;while((pid waitpid(0, status, WNOHANG)) 0) //0:回收跟调用进程同组的子进程的资源WNOHANG:不阻塞{if (WIFEXITED(status))printf(pid %d, parent pid %d, child pid %d, exit status %d\n, pid, getpid(), siginfo-si_pid, WEXITSTATUS(status));else if (WEXITSTATUS(status))printf(pid %d, parent pid %d, child pid %d, exit by signal %d\n , pid, getpid(), siginfo-si_pid, WIFSIGNALED(status));} }void sys_err(const char *str, int err) {perror(str);exit(err); }int main(int argc, char *argv[]) {if (argc 2){printf(%s port\n, argv[0]);exit(1);}//创建流式套接字int lfd socket(AF_INET, SOCK_STREAM, 0);if (lfd 0)sys_err(socket, 1);//绑定ip端口 struct sockaddr_in server_addr;server_addr.sin_family AF_INET;server_addr.sin_port htons((unsigned short)atoi(argv[1]));server_addr.sin_addr.s_addr 0; //0表示将本机所有ip都绑定上int ret bind(lfd, (struct sockaddr *)server_addr, sizeof(server_addr));if (ret 0)sys_err(bind, 1);//监听ret listen(lfd, 128);if (ret 0)sys_err(listen, 1);//阻塞SIGCHLD信号sigset_t set;sigemptyset(set);sigaddset(set, SIGCHLD);sigprocmask(SIG_BLOCK, set, NULL);int block 1;//循环提取int cfd;pid_t pid;struct sockaddr_in client_addr; socklen_t len sizeof(client_addr);char buf[BUF_SIZE];ssize_t size;char ip[INET_ADDRSTRLEN] ;while(1){cfd accept(lfd, (struct sockaddr *)client_addr, len);if (cfd 0){if (errno EINTR)continue;sys_err(accept, 1);}printf(client ip %s, port %d connect success\n, inet_ntop(AF_INET, client_addr.sin_addr.s_addr, ip, sizeof(ip)), ntohs(client_addr.sin_port));pid fork();if (pid 0){//in childclose(lfd); //关闭不用了的监听套接字//解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, set, NULL);block 0;while(1){memset(buf, 0, sizeof(buf));size read(cfd, buf, sizeof(buf));if (size 0) //客户端断开连接{printf(client close\n);break;}printf(%s\n, buf);write(cfd, buf, size);}break;}else if (pid 0){//in parentclose(cfd); //关闭不用了的跟客户端通讯的套接字if (1 block){//先捕捉struct sigaction sa;sa.sa_sigaction do_sigchld;sigemptyset(sa.sa_mask);sa.sa_flags SA_SIGINFO;sigaction(SIGCHLD, sa, NULL);//后解除阻塞sigprocmask(SIG_UNBLOCK, set, NULL);block 0;}}elsesys_err(fork, 1);}//关闭套接字if (pid 0)close(cfd);else if (pid 0)close(lfd);return 0; }客户端代码#include stdio.h #include unistd.h #include sys/socket.h #include arpa/inet.h #include stdlib.h #include string.hint main(int argc, char *argv[]) {if (argc 3){printf(%s sever_ip server_port\n, argv[0]);exit(1);}//创建流式套接字int fd socket(AF_INET, SOCK_STREAM, 0);if (fd 0){perror(socket);exit(1);}//连接服务器struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons((unsigned short)atoi(argv[2]));addr.sin_addr.s_addr inet_addr(argv[1]);int ret connect(fd, (struct sockaddr *)addr, sizeof(addr));printf(connect ret %d\n, ret);if (ret 0){perror(connect);exit(1);}//读写数据char buf_w[128] ;char buf_r[128] ;ssize_t size_r 0;while(1){fgets(buf_w, sizeof(buf_w), stdin);buf_w[strlen(buf_w) - 1] 0;write(fd, buf_w, strlen(buf_w));size_r read(fd, buf_r, sizeof(buf_r));if (size_r 0) //服务器断开break;elseprintf(%s\n, buf_r);memset(buf_w, 0, sizeof(buf_w));memset(buf_r, 0, sizeof(buf_r));}//关闭套接字close(fd);return 0; }结果3个客户端连接服务器时服务端客户端ps aux 可以看到有4个服务器进程其中一个是主进程用于监听处理新的连接其他3个子进程用于跟客户端进行通信回射服务信息截图客户端1客户端2客户端3服务器收到进行打印3个客户端都退出时服务端收到客户端退出并回收跟客户端进行通信的3个子进程的资源ps aux 查看可以看到只剩主进程用于监听处理新的连接其他3个子进程都已结束
http://www.hkea.cn/news/14527061/

相关文章:

  • 西安专业网络推广公司深圳seo网站推广报价
  • 个人网站做哪种能赚钱公司网站建设属于什么职位
  • 建设门户网站系统的必要性微信开放平台怎么注销账号
  • 太原网站建设-中国互联辽宁建设工程招标网
  • 唐山做网站企业2023年互联网创业项目
  • 深圳市招聘信息网站包装设计软件
  • 网站建设yingkagouhtml5用什么软件
  • 商务网站建设实践实训心得网站建设的运营计划书
  • 证券投资网站建设沈阳网站排名seo
  • 做瞹免费视频网站wordpress 页脚
  • 西宁网站建设费用应用商店aso
  • Ul设计网站仙游县建设局网站
  • wap建设网站怎么推广外贸网站
  • 网站上的图片格式怎么做重庆永川建设银行网站
  • 网站内容避免被采集莱芜都市网旗下论坛
  • 广州建站哪个济南兴田德润实惠吗网站排名优化培训
  • 有没有免费的网站推销产品网页顶部导航栏设计
  • 百度搜索引擎推广步骤网站关键词排名怎么优化
  • 怎样制作一个自己的网站湖南做网站seo
  • 天津建设招标网站首页化妆品网站建设描述
  • 中小企业建站排名如何在阿里云上做网站
  • 网站开发用到的框架最大的中文搜索引擎
  • 济南腾飞网络网站建设广州致格广告有限公司网站
  • 欧米茄手表价格及图片官方网站网站新闻字体
  • 网站的结构包括哪些内容互联网服务平台怎么注册
  • 设计方案表网站名称一个网站开发
  • 沥林网站建设马甲比较好找人做网页需要多少钱
  • 网站建设的进度计划书pc端网站生成wap版
  • 如何制作网站app网站模板免费下载网站
  • 东莞网站优化关键词费用网站优化是什么意思