
并发以后就可以,一边听歌,一边浏览网页。即,看起来像同一时间可以干多个事情。
同步,就是一种控制策略。
就比如说,用迅雷看电影。一边下载,一边播放。这个时候下载进程和播放进程,他们两个就有同步的机制,例如:只能播放视频文件中已经下载完成的部分,没有下载的不能播放。并且,如果已经下载的全部播放完了,那播放器就要等待,等到有内容的时候再继续播放。
并发怎么写:首先要把任务拆分成多个能独立执行的部分。例如:下载部分,播放部分。
然后控制好并行部分的运行机制。
你去查一下OpenMP相关书籍,用OpenMP库函数实现吧,Linux的gcc编译器4.2版以后开始内置OpenMP并行支持,源程序里多写两句话就搞定的事情,不过OpenMP建立的是轻量级进程(在Windows下叫线程的东西)。如果要用严格意义上的“进程”实现,还有一个多线程并行的工具是MPICH2,设计目的是多计算机分布式并行计算的,当然也能用在单一计算机上。
只是做这些动作的话不需要多线程找了下以前写的 改成了你说的10次发送client.c:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>int main(int argc,char **argv){ char wbuf[] = "hello server" char rbuf[128] int i int sock struct sockaddr_in server = {0} struct timeval timeo timeo.tv_sec = 0 timeo.tv_usec = 1000 * 1000 // socklen_t len = sizeof(timeo) if( argc != 2){ printf("usage: ./client <ipaddress>\n") return -1 } sock = socket(AF_INET, SOCK_STREAM, 0) if(sock <0) { perror("Create TCP Socket") return -1 } setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len) server.sin_family = AF_INET server.sin_port = htons(30000) inet_pton(AF_INET, argv[1], &(server.sin_addr)) int res = connect(sock, (struct sockaddr*)&server, sizeof(server)) if (res <0) { if(res == EINPROGRESS) perror("connecting stream socket time out:") else perror("connecting stream socket error:") close(sock) return -1 } else { printf("Connect Server@%s\n",argv[1]) for(i=0i<10i++) { int wsize = send(sock,wbuf,sizeof(wbuf),0) if(wsize<=0) { perror("write error:") close(sock) return -1 } printf("1111111i=%d\n",i) while(1) { int rsize=recv(sock,rbuf,sizeof(rbuf),0) if(rsize>0) { rbuf[rsize]='\0' printf("recv msg from server: %s\n",rbuf) break } if(rsize<0) { close(sock) perror("read error:") return -1 } } } close(sock) return 0 }}server.c:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>int main(int argc, char** argv){intlistenfd, connfd struct sockaddr_in servaddr = {0} charrbuf[128] charwbuf[] = "hello client" int n if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ perror("Create TCP Socket") return -1 }servaddr.sin_family = AF_INET servaddr.sin_addr.s_addr = htonl(INADDR_ANY) servaddr.sin_port = htons(30000) if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ perror("bind socket error:") return -1 }if( listen(listenfd, 10) == -1){ perror("listen socket error:") return -1 }printf("======waiting for client's request======\n") while(1){ if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1) {perror("accept socket error:") continue } while(1) { n = recv(connfd, rbuf, sizeof(rbuf), 0) if(n>0) { rbuf[n] = '\0' printf("recvmsg from client: %s\n", rbuf) n = send(connfd, wbuf, sizeof(wbuf),0) if(n<=0) { perror("sned error:") close(connfd) break } } else if(n <0) { perror("recv error:") close(connfd) break } } close(connfd) }close(listenfd) return 0}运行的时候 client ./client 你的serverip端口我用的30000 写死在程序里了欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)