并发服务器--02(基于多线程)
2015-07-12 12:05
381 查看
这篇是继前三篇并发服务器--01(基于进程派生)、并发服务器--02(基于I/O复用——运用Select函数)和并发服务器--02(基于I/O复用——运用epoll技术)的第4篇关于并发服务器的博文。
关于Linux上多线程详情请参看前一博文Linux多线程编程初探。
本文相对就简陋一点了,只记简单笔记,待后续有更丰富内容再添加。
编译链接时记得就-lunp和-lpthread。
关于Linux上多线程详情请参看前一博文Linux多线程编程初探。
本文相对就简陋一点了,只记简单笔记,待后续有更丰富内容再添加。
客户端程序
/*#include "unp.h"*/ #include "unpthread.h" void *copyto(void *); void str_cli_thread(FILE *fp_arg, int sockfd_arg); static int sockfd; /* global for both threads to access */ static FILE *fp; int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; if(argc != 2) err_quit("usage: tcpcli <IPaddress>"); sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); Inet_pton(AF_INET, argv[1], &servaddr.sin_addr.s_addr); Connect(sockfd, (SA *) &servaddr, sizeof(servaddr)); str_cli_thread(stdin, sockfd); exit(0); } void str_cli_thread(FILE *fp_arg, int sockfd_arg) { char recvline[MAXLINE]; pthread_t tid; sockfd = sockfd_arg; fp = fp_arg; if(pthread_create(&tid, NULL, copyto, NULL) != 0) { printf("create thread fails"); return; } while(Readline(sockfd, recvline, MAXLINE) > 0) Fputs(recvline, stdout); } void *copyto(void *arg) { char sendline[MAXLINE]; while(Fgets(sendline, MAXLINE, fp) != NULL) Writen(sockfd, sendline, strlen(sendline)); Shutdown(sockfd, SHUT_WR); /* EOF on stdin, send FIN */ return(NULL); }
编译链接时记得就-lunp和-lpthread。
服务端程序
#include "unpthread.h" static void *doit(void *); /* each thread executes this function */ int main(int argc, char **argv) { int listenfd, *iptr; pthread_t tid; socklen_t addrlen, len; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); for( ; ; ) { addrlen = sizeof(cliaddr); iptr = Malloc(sizeof(int)); *iptr = Accept(listenfd, (SA *) &cliaddr, &addrlen); Pthread_create(&tid, NULL, &doit, iptr); } exit(0); } static void *doit(void *arg) { int connfd; connfd = *((int *) arg); free(arg); Pthread_detach(pthread_self()); str_echo(connfd); /* same function as before */ Close(connfd); return(NULL); }
参考资料
《UNIX网络编程 卷1》相关文章推荐
- stl非变易算法(二)
- CodeForces 158 B. Taxi(模拟)
- 排序算法--桶排序
- 关于“如何检测节点网络中是否存在闭环之java实现”的程序bug修复
- CS 224D Lecture 3札记
- java多线程基础知识总结
- C++腾讯笔试题
- 多线程请求乌云链接
- It's my life
- 开通51CTO博客,渐入佳境!
- 几个排序算法总结,从冒泡到快速排序
- 世界杯推动彩票APP爆发,谁将会笑到最后?
- 移动web开发规范
- html5 命运之轮生产
- 一步步解读《编写高质量代码》 js篇
- 垃圾回收基础知识
- 学习笔记-Javascript
- Linux 改变计算机名
- 论闭包中的变量是否都保存在内存中。
- 数星星