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

成都高新区网站建设vs2012 做网站教程

成都高新区网站建设,vs2012 做网站教程,网站建设公司行情,网页制作与设计千年之恋代码前面分别用多进程和多路复用完成了TCP网络通信#xff0c;本文就来讲讲多线程的TCP通信。首先来了解一下线程的概念#xff1a; 1、线程是进程的执行路线#xff0c;它是进程内部的控制序列#xff0c;或者说线程是进程的一部分(进程是一个资源单位#xff0c;线程是执行单…        前面分别用多进程和多路复用完成了TCP网络通信本文就来讲讲多线程的TCP通信。首先来了解一下线程的概念 1、线程是进程的执行路线它是进程内部的控制序列或者说线程是进程的一部分(进程是一个资源单位线程是执行单位线程是进程的一部分负责真正的执行)     2、线程是轻量级的没有自己独立的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前目录信息等资源     3、线程有自己独立的栈内存、线程ID、错误码、信号屏蔽掩码     4、一个进程中可以包含多个线程(多个执行路线)但是至少有一个线程在活动称为主线程     5、ps -T -p pid 查看pid进程中的线程情况 或者htop命令也可以查看        6、线程是进程的实体可以当做系统独立的任务调度和分配的基本单位     7、线程有不同的状态、属性系统提供了线程的控制接口例如创建、销毁、控制      8、进程中的所有线程同在一个虚拟地址空间中进程中的所有资源对于线程而言都是共享的因此当多个线程协同工作时需要解决资源竞争问题(加锁)     9、线程的系统开销很小、任务切换快、多个线程之间不需要数据交换、因此不需要类似于XSI的通信机制因此使用线程简单而高效    10、线程之间有优先级的差异 在了解线程的概念之后要想代码实现多线程TCP还需要了解一些函数的基本用法 1、int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);     功能创建新线程     thread输出型参数用于获取线程ID     attr: 用于设置线程属性一般写NULL即可     start_routine线程的入口函数相当于主线程的main函数     arg:传递给start_routine入口函数的参数     返回值成功返回0失败返回错误编码 注意入口函数的参数、返回值要确保它的可持续性因此不太适合使用栈内存可以考虑堆内存、全局变量 2、int pthread_join(pthread_t thread, void **retval);     功能等待线程结束并获取该线程结束时的入口函数的返回值并释放线程资源     thread要等待的线程的ID     retval用于存储线程结束时返回值的地址拿到返回值变量本身     返回值成功返回0失败返回错误编码 3、 pthread_t pthread_self(void);     功能获取当前线程的线程ID    此函数在哪里调用就取哪里的线程ID 4、int pthread_equal(pthread_t t1, pthread_t t2);     功能比较两个线程ID是否一致     返回值一致返回非零值不一致返回0     注意:在个别操作系统下pthread_t 是以结构实现的大部分是以 unsigned long 呈现为了可移植性不能直接使用 比较         pthread_t tid;  //不要初始化 提高可移植性 下面就来看一下代码实现部分 服务端 #include stdio.h #include string.h #include stdlib.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include pthread.h typedef struct Client {int cli_fd;pthread_t tid;struct sockaddr_in cli_addr; } Client;size_t client_count 0;void* run(void* arg) { //立刻保存否则新的连接可能会覆盖上一个连接导致操作的都是最后一个线程int cli_fd *(int*)arg;char buf[4096]; size_t buf_size sizeof(buf); while (1){ int ret recv(cli_fd, buf, buf_size, 0); if (ret 0 || strcmp(buf, quit) 0){ printf(客户端%d退出\n, cli_fd);close(cli_fd); return NULL; } printf(from %d recv: %s bits: %d tid:%lu\n, cli_fd, buf, ret,pthread_self()); strcat(buf, :return); send(cli_fd, buf, strlen(buf) 1, 0); if (ret 0){close(cli_fd);printf(客户端%d退出\n, cli_fd); break; } } close(cli_fd); pthread_exit(NULL); }int main(int argc, const char* argv[]) { int sockfd socket(AF_INET, SOCK_STREAM, 0); if (sockfd 0) { perror(socket); return -1; } struct sockaddr_in addr {},cli_addr {}; addr.sin_family AF_INET; addr.sin_port htons(8866); addr.sin_addr.s_addr inet_addr(127.0.0.1); socklen_t addrlen sizeof(addr); if (bind(sockfd, (struct sockaddr*)addr, addrlen) 0){ perror(bind); return -1; } if (listen(sockfd, 5) 0){ perror(listen); return -1; } //准备服务客户端的结构体50个Client *client calloc(50,sizeof(Client));size_t index 0;while (1){ //找空闲的client(cli_fd为0认为是空闲)while(client[index].cli_fd){//若没有空闲,则等待10s钟再尝试if(client_count50){sleep(10);}index (index1)%50;}//从上面的循环出来。则第index个client是空闲的client[index].cli_fd accept(sockfd, (struct sockaddr*)client[index].cli_addr, addrlen); if(client[index].cli_fd0){perror(accept);continue;}pthread_create(client[index].tid, NULL, run, (void*)(client[index].cli_fd));client_count;/*pthread_t tid;int cli_fd accept(sockfd, (struct sockaddr*)cli_addr, addrlen); if (cli_fd 0){ perror(accept);continue; } //创建线程处理客户端请求pthread_create(tid, NULL, run, (void*)(cli_fd)); //usleep(1000);pthread_detach(tid);*/} return 0; } 客户端 #include stdio.h #include string.h #include sys/types.h #include sys/socket.h #include unistd.h #include sys/un.h #include stdlib.h #include arpa/inet.h #include netinet/in.htypedef struct sockaddr *SP;int main(int argc,const char* argv[]) {//创建socketint cli_fdsocket(AF_INET,SOCK_STREAM,0);if(cli_fd0){perror(socket);return -1;}//准备通信地址struct sockaddr_in addr{};addr.sin_familyAF_INET;addr.sin_porthtons(8866);addr.sin_addr.s_addrinet_addr(127.0.0.1);socklen_t addrlensizeof(addr);//连接服务器if(connect(cli_fd,(SP)addr,addrlen)){perror(connect);return -1;}char buf[4096];size_t buf_sizesizeof(buf);while(1){//发送请求printf();scanf(%s,buf);int retsend(cli_fd,buf,strlen(buf)1,0);//retwrite(cli_fd,buf,strlen(buf)1);if(ret0){printf(服务器正在升级请稍后重试\n);break;}if(0strcmp(quit,buf)){printf(通信结束\n);break;}//接收请求//int retread(cli_fd,buf,buf_size);retrecv(cli_fd,buf,buf_size,0);if(ret0){printf(服务器正在维护请稍候重试\n);break;}printf(read:%s bits:%d\n,buf,ret);}return 0; }over
http://www.hkea.cn/news/14324608/

相关文章:

  • 怎么策划一个网站短剧小程序搭建
  • 营销型网站建设风格设定包括哪些方面?自己网上开店怎么做
  • 玉器珠宝做网站网络空间安全就业前景
  • 济南网站建设代码自己做网站 如何推广
  • 一站式网站手机端怎么做wordpress去掉浏览数
  • 建店前期网站开通怎么做分录建立企业网站几天
  • 网站开发详细设计模板网页设计代码开头
  • 外贸订单在哪里能接到南京seo排名扣费
  • 天津网站建设案例展示精品课程网站建设总结报告
  • 网站全屏轮播怎么做网站做任务
  • 电脑怎样重新安装wordpress南宁网站排名优化
  • 网站建设电话销售说不需要网站快照历史
  • 抚顺市 网站建设网站的优缺点
  • 建站服务的网络公司有哪些wordpress评论邮件通知
  • 衡阳网站建设公司百度网站权重
  • 外贸网站论文网站建设管理工作情况汇报
  • 免费 企业网站管理系统山东德州网站建设哪家最好
  • 张家港做网站多少钱网站建设带主机
  • 如何买域名发布网站济南医院网站建设服务公司
  • 网站建设知识论文做临时工看哪个网站
  • 资源网站推荐怎么创建网站 免费滴
  • 网站建设费算什么费用孝感 商务 网站建设
  • 四大门户网站青岛关键词优化seo
  • 大连网站建设方案维护iis 网站拒绝显示此网页
  • 网站建设 金疙瘩计划网站建设电话营销
  • 哪些网站是用h5做的c# 网站开发框架
  • 模仿别人的网站公司注册资金可以随便填吗
  • 未成年做网站沈阳网站seo排名
  • 增光路网站建设网站的建设公司哪家好
  • 网站更换服务器 备案在哪个网站里下载的图片可以做展架