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

杭州哪家网站建设公司好保山市住房和城乡建设厅网站

杭州哪家网站建设公司好,保山市住房和城乡建设厅网站,农商1号的网站建设费,wordpress自定义页面跳转常见的socket函数封装和多进程和多线程实现服务器并发 1.常见的socket函数封装2.多进程和多线程实现服务器的并发2.1多进程服务器2.2多线程服务器2.3运行效果 1.常见的socket函数封装 accept函数或者read函数是阻塞函数#xff0c;会被信号打断#xff0c;我们不能让它停止会被信号打断我们不能让它停止所以我们应该进行一些封装操作。 //wrap.h#ifndef __WRAP_H_ #define __WRAP_H_ #include stdlib.h #include stdio.h #include unistd.h #include errno.h #include string.h #include sys/socket.h #include arpa/inet.h #include strings.hvoid perr_exit(const char *s); int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr); int Bind(int fd, const struct sockaddr *sa, socklen_t salen); int Connect(int fd, const struct sockaddr *sa, socklen_t salen); int Listen(int fd, int backlog); int Socket(int family, int type, int protocol); ssize_t Read(int fd, void *ptr, size_t nbytes); ssize_t Write(int fd, const void *ptr, size_t nbytes); int Close(int fd); ssize_t Readn(int fd, void *vptr, size_t n); ssize_t Writen(int fd, const void *vptr, size_t n); ssize_t my_read(int fd, char *ptr); ssize_t Readline(int fd, void *vptr, size_t maxlen); int tcp4bind(short port,const char *IP); #endif 下面是相关函数的实现 //wrap.c#include stdlib.h #include stdio.h #include unistd.h #include errno.h #include string.h #include sys/socket.h #include arpa/inet.h #include strings.hvoid perr_exit(const char *s) {perror(s);exit(-1); }int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr) {int n;again:if ((n accept(fd, sa, salenptr)) 0) {if ((errno ECONNABORTED) || (errno EINTR))goto again;elseperr_exit(accept error); }return n; }int Bind(int fd, const struct sockaddr *sa, socklen_t salen) {int n;if ((n bind(fd, sa, salen)) 0)perr_exit(bind error);return n; }int Connect(int fd, const struct sockaddr *sa, socklen_t salen) {int n;if ((n connect(fd, sa, salen)) 0)perr_exit(connect error);return n; }int Listen(int fd, int backlog) {int n;if ((n listen(fd, backlog)) 0)perr_exit(listen error);return n; }int Socket(int family, int type, int protocol) {int n;if ((n socket(family, type, protocol)) 0)perr_exit(socket error);return n; }ssize_t Read(int fd, void *ptr, size_t nbytes) {ssize_t n;again:if ( (n read(fd, ptr, nbytes)) -1) {if (errno EINTR)goto again;elsereturn -1;}return n; }ssize_t Write(int fd, const void *ptr, size_t nbytes) {ssize_t n;again:if ( (n write(fd, ptr, nbytes)) -1) {if (errno EINTR)goto again;elsereturn -1;}return n; }int Close(int fd) {int n;if ((n close(fd)) -1)perr_exit(close error);return n; } 2.多进程和多线程实现服务器的并发 当有多个客户端向服务器发送数据的时候我们如何去操作这就涉及到了我们的多线程和多进程开发了下面看看如何来实现。 2.1多进程服务器 (1)首先我们想如何通过多进程来实现呢那么我们得想清楚父子进程分别来干啥我们可以这样父进程来获取连接。 (2)然后子进程来进行通信发送数据给服务端。 (3)最后我们利用信号的方式来回收子进程防止出现僵尸进程。 /*多进程实现并发主进程中使用sigaction函数回收子进程*/ #include signal.h #include sys/wait.h #include sys/types.h #include unistd.h #include wrap.hvoid sighandler(int sig) {pid_t wpid;//回收子进程while(1){wpid waitpid(-1, NULL, WNOHANG);if(wpid 0){break;}} }int main() {int lfd Socket(AF_INET, SOCK_STREAM, 0);//设置端口复用int opt 1;setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(int));struct sockaddr_in serverAddr;bzero(serverAddr, sizeof(serverAddr));serverAddr.sin_family AF_INET;serverAddr.sin_port htons(8888);serverAddr.sin_addr.s_addr htonl(INADDR_ANY);Bind(lfd, (struct sockaddr*)serverAddr, sizeof(serverAddr));Listen(lfd, 128);//将SIGCHLD信号阻塞sigset_t mask;sigemptyset(mask);sigaddset(mask, SIGCHLD);sigprocmask(SIG_BLOCK, mask, NULL);int cfd;pid_t mpid;struct sockaddr_in clientAddr;socklen_t len sizeof(clientAddr);while(1){cfd Accept(lfd, (struct sockaddr*)clientAddr, len);mpid fork();if (mpid 0){perror(fork error:);exit(0);}else if (mpid 0){close(cfd);//signal(SIGCHLD, sighandler);//注册信号处理函数struct sigaction act;act.sa_handler sighandler;sigemptyset(act.sa_mask);act.sa_flags 0;sigaction(SIGCHLD, act, NULL);//解除对SIGCHLD信号的阻塞sigprocmask(SIG_UNBLOCK, mask, NULL);}else if(mpid 0){//子进程中执行消息收发close(lfd);char buf[1024];int nLen; char cIP[16];while(1){memset(buf, 0, sizeof(buf));nLen Read(cfd, buf, sizeof(buf));if (nLen 0){perror(read error:);break;}printf(%s--%d: %s\n, inet_ntop(AF_INET, clientAddr.sin_addr.s_addr, cIP, sizeof(cIP)), ntohs(clientAddr.sin_port), buf);strcat(buf, ---recvied);Write(cfd, buf, strlen(buf));}close(cfd);exit(0); //子进程退出防止子进程继续创建子进程}}close(lfd);return 0; } 2.2多线程服务器 接下来就是多线程服务器如何去实现呢 我们可以参考上面的多进程开发: (1)首先我们利用主进程来获取连接。 (2)然后利用子线程来和服务器进行通信给服务器发送数据。 (3)最后设置线程分离属性任务完成后自动回收子线程。 注意 (1)线程和进程之间是有不同的线程的文件描述符时共享的一旦有一个新的连接过来的时候所有的通信文件描述符cfd都会改变但是进程时写时拷贝的所以进程不会出现这种情况。因此在使用线程开发时我们要分别给他们开辟空间这里可以用一个结构体不同线程使用不同的空间。 (2)由于线程的文件描述符是共享的所以我们不可以关闭父线程的通信文件描述符这样会导致子线程的通信文件描述符全关闭导致子线程无法正常通信而进程程会有计数引用只会是通信文件描述符的引用次数减1不会直接全部关闭。 下面是代码 /*多线程实现并发 解决多个子线程共享cfd存在的问题*/ #include wrap.h #include pthread.h#define MAX_NUM 100struct PthreadInfo {int cfd; //若为-1表示可用, 大于0表示已被占用pthread_t threadID;struct sockaddr_in clientAddr; }; //定义结构体数组不同的线程访问不同的内存 struct PthreadInfo info[MAX_NUM];//线程执行函数 void* mythread(void* arg) {struct PthreadInfo* p (struct PthreadInfo*)arg;char buf[1024];int cfd p-cfd;ssize_t len;while (1){memset(buf, 0, sizeof(buf));len Read(cfd, buf, sizeof(buf));if (len 0){perror(read error:);close(cfd);p-cfd -1; //设置为-1表示该位置可用pthread_exit(NULL);}printf(%s\n, buf);strcat(buf, ---recvied);Write(cfd, buf, strlen(buf));}}void init_info() {//初始化数组当cfd -1时表明这块内存空间可以使用for (size_t i 0; i MAX_NUM; i){info[i].cfd -1;} }int find_index() {int i;for(i 0; i MAX_NUM; i){if (info[i].cfd -1){break;}}if (i MAX_NUM){return -1;}return i; }int main() {int lfd Socket(AF_INET, SOCK_STREAM, 0);//设置端口复用int opt 1;setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(int));struct sockaddr_in serverAddr;bzero(serverAddr, sizeof(serverAddr));serverAddr.sin_family AF_INET;serverAddr.sin_port htons(8888);serverAddr.sin_addr.s_addr htonl(INADDR_ANY);Bind(lfd, (struct sockaddr*)serverAddr, sizeof(serverAddr));Listen(lfd, 128);//初始化init_info();int cfd;int ret;int idx;socklen_t len;struct sockaddr_in client;while (1){len sizeof(client);bzero(client, len);cfd Accept(lfd, (struct sockaddr*)client, len);//找数组中空闲的位置idx find_index();if (idx -1){close(cfd);continue;}//对空闲位置的元素的成员赋值info[idx].cfd cfd;memset(info[idx].clientAddr, client, len);//创建子线程---该子线程完成对数据的收发ret pthread_create(info[idx].threadID, NULL, mythread, info[idx]);if(ret!0){printf(create thread error:[%s]\n, strerror(ret));exit(-1);}//设置子线程为分离属性pthread_detach(info[idx].threadID);}close(lfd);return 0; } 我们在写的时候发现当一些进程完成通信以后关闭文件描述符我们的空间是无法进行回收的这样就会大大浪费空间因此我们可以写一个函数来返回结束通信的空间位置可利用的空间来使用这块空间。 int find_index() {int i;for(i 0; i MAX_NUM; i){if (info[i].cfd -1){break;}}if (i MAX_NUM){return -1;}return i; }2.3运行效果 下面我们看看效果 1.这是连接的第一个客户端可以看到通信正常 2.这是连接的第二个客户端通信也正常 3.我们用命令来看看连接的状态 可以看到tcp连接是一个双向的可靠连接我们连接了两个客户端所以有四个连接可以看到都处于ESTABLISHESD的状态可以看出是达到了效果。两个客户端和服务端的通信都是正常的。
http://www.hkea.cn/news/14365028/

相关文章:

  • 手机端网站尺寸网站开发学费
  • 建设银行忘记密码网站外贸 网站 建设 制作 成都
  • 采用模版建网站的缺点wordpress 文章无法显示
  • 普通电脑可以做网站服务器it外包项目都在哪接的
  • 河北中太建设集团有限公司网站乐平网站设计
  • 网站公司排行榜wordpress </a> </li> <li> <a href="/news/14365020/">甘肃精神文明建设网站联科网站建设</a> </li> <li> <a href="/news/14365018/">百度不收录手机网站吗佛山seo优化外包</a> </li> <li> <a href="/news/14365017/">备案的网站转移ui界面设计培训班</a> </li> <li> <a href="/news/14365016/">湖南城乡和建设厅网站wordpress 优惠插件</a> </li> <li> <a href="/news/14365015/">360做网站的苏州建设交通高等职业技术学院</a> </li> <li> <a href="/news/14365014/">适合个人做的网站佛山网站优化体验</a> </li> <li> <a href="/news/14365013/">企业网站最重要的访问对象是营销导向企业网站策划</a> </li> <li> <a href="/news/14365011/">公司网站二维码怎么做宣传网站建设的步骤</a> </li> <li> <a href="/news/14365010/">做网站主要注意些什么怎么编写网站代码</a> </li> <li> <a href="/news/14365009/">在线网站优化wordpress php5.3.5访问慢</a> </li> <li> <a href="/news/14365006/">淘宝店的网站建设分析wordpress模板淘点金</a> </li> <li> <a href="/news/14365005/">芜湖网站清远市企业网站seo</a> </li> <li> <a href="/news/14365004/">一个网站用几个域名优质的网站建设</a> </li> <li> <a href="/news/14365003/">清河做网站多少钱杭州网站设计的公司</a> </li> <li> <a href="/news/14365002/">廊坊网站建设优化wordpress 双主页</a> </li> <li> <a href="/news/14365001/">国外素材网站开网店 建网站要钱吗</a> </li> <li> <a href="/news/14365000/">松江附近做网站网站运营推广方法总结</a> </li> <li> <a href="/news/14364999/">威海企业做网站哪家好医疗软件公司排名</a> </li> <li> <a href="/news/14364998/">山西大同专业网站建设制作价格赣州章贡区地图</a> </li> <li> <a href="/news/14364997/">做网站的那些高清图上哪里找重庆公司注册流程</a> </li> <li> <a href="/news/14364996/">东莞网站建设 少儿托管手机app快速开发平台</a> </li> <li> <a href="/news/14364995/">西安做网站报价西安网站开发建设</a> </li> <li> <a href="/news/14364994/">用asp做网站有哪些功能fedora做网站服务器</a> </li> <li> <a href="/news/14364993/">中国物流网站外国知名个人网站</a> </li> </div> </article> </main> </div> </div> <aside id="secondary" class="widget-area sidebar"> <div class="widget widget_posts_thumbnail" style="margin-top:6px;"> <h2 class="widget-title">最新文章</h2> <ul> <li class="clear"> <a href="/news/14365911/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/python 网站开发小项目沙河高端网站建设" alt=" python 网站开发小项目沙河高端网站建设" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365911/" rel="bookmark"> python 网站开发小项目沙河高端网站建设</a> <div class="entry-meta">2026/4/22 8:48:09</div></div> </li> <li class="clear"> <a href="/news/14365910/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/网站购买流程室内设计软件3d" alt=" 网站购买流程室内设计软件3d" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365910/" rel="bookmark"> 网站购买流程室内设计软件3d</a> <div class="entry-meta">2026/4/22 8:48:02</div></div> </li> <li class="clear"> <a href="/news/14365909/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/怎么做考试资料网站一小时学会网站建设" alt=" 怎么做考试资料网站一小时学会网站建设" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365909/" rel="bookmark"> 怎么做考试资料网站一小时学会网站建设</a> <div class="entry-meta">2026/4/22 8:47:56</div></div> </li> <li class="clear"> <a href="/news/14365908/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/怎么选择企业建站公司wordpress 微博同步插件" alt=" 怎么选择企业建站公司wordpress 微博同步插件" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365908/" rel="bookmark"> 怎么选择企业建站公司wordpress 微博同步插件</a> <div class="entry-meta">2026/4/22 8:47:50</div></div> </li> <li class="clear"> <a href="/news/14365907/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/网站投资设计coding 部署wordpress" alt=" 网站投资设计coding 部署wordpress" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365907/" rel="bookmark"> 网站投资设计coding 部署wordpress</a> <div class="entry-meta">2026/4/22 8:47:44</div></div> </li> <li class="clear"> <a href="/news/14365905/" rel="bookmark"> <div class="thumbnail-wrap"> <img width="120" height="80" src="http://pic.xiahunao.cn/yaotu/文学网站建设学校网站开发实际意义" alt=" 文学网站建设学校网站开发实际意义" /> </div> </a> <div class="entry-wrap"> <a href="/news/14365905/" rel="bookmark"> 文学网站建设学校网站开发实际意义</a> <div class="entry-meta">2026/4/22 8:47:31</div></div> </li> </ul> </div> <div class="leftdiv2"> </div> </aside> </div> <footer id="colophon" class="site-footer"> <div class="clear"></div> <div id="site-bottom" class="clear"> <div class="container"> <div class="menu-m_footer-container"> <ul id="footer-menu" class="footer-nav"> <li> <strong> <a href="/">核客编程介绍</a></strong> </li> <li> <strong> <a href="/">商务合作</a></strong> </li> <li> <strong> <a href="/">免责声明</a></strong> </li> </ul> </div> <div class="site-info"> <p>CopyRight © <a href="/">核客编程</a>版权所有 </p> </div> </div> </div> </footer> </div> <div id="back-top"> <a href="#top" title="返回顶部"> <svg width="38" height="38" viewbox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect width="48" height="48" fill="white" fill-opacity="0.01" /> <path d="M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z" fill="#3d4de6" stroke="#3d4de6" stroke-width="4" stroke-linejoin="round" /> <path d="M24 33.5V15.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" /> <path d="M33 24.5L24 15.5L15 24.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" /></svg> </a> </div> <script src='/templates/nzzt/js/common.js'></script> <script> $(function(){ $('.source_url').text('原文地址:https://blog.csdn.net/m0_74234328/article/details/136329301'); }); /*$('.source_url').on("click",function() { window.open('https://blog.csdn.net/m0_74234328/article/details/136329301', '_blank'); });*/ </script> </body> </html>