当前位置:   article > 正文

多线程并发服务器的实现_通过多线程实现并发服务器

通过多线程实现并发服务器

1.多线程服务器的实现是在多进程服务器的基础上增改了一些功能

创建流程:

        1.套接字的创建,ip地址初始化

        2.bind使套接字与主机捆绑

        3.listen()建立监听;

        4.通信模块:read函数将读取的数据保存在数组中

        5.主函数:调用函数完成套接字的创建等基本步骤

                           accept函数

                           创建线程,对通信模块的调用

  1. #define IP "0"
  2. #define PORT 7777
  3. #define BACKLOG 1000
  4. //初始化服务器
  5. int init_sever(char *ip,int port,int backlog)
  6. {
  7. int listenfd = socket(PF_INET,SOCK_STREAM,0);
  8. if(-1 == listenfd)
  9. {
  10. perror("listen");
  11. exit(-1);
  12. }
  13. struct sockaddr_in seraddr = {0};
  14. seraddr.sin_family = PF_INET;
  15. seraddr.sin_port = htons(port);
  16. seraddr.sin_addr.s_addr = inet_addr(ip);
  17. //地址复用
  18. int opt = 1;
  19. setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  20. //连接主机
  21. int ret = bind(listenfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
  22. if(-1 == ret)
  23. {
  24. perror("bind");
  25. exit(-1);
  26. }
  27. //设置监听
  28. ret = listen(listenfd,backlog);
  29. if(-1 == ret)
  30. {
  31. perror("listen");
  32. exit(-1);
  33. }
  34. return listenfd;
  35. }
  1. //通信功能函数
  2. void *client_con(void *pthread)
  3. {
  4. int connfd = *(int *)pthread;
  5. char buf[BUFSIZ] = {0};
  6. int cli_say;
  7. while(1)
  8. {
  9. memset(buf,0,sizeof(buf));
  10. cli_say = read(connfd,buf,BUFSIZ);
  11. if(-1 == cli_say)
  12. {
  13. perror("read");
  14. close(connfd);
  15. exit(-1);
  16. }
  17. else if(0 == cli_say)
  18. {
  19. perror("read");
  20. exit(0);
  21. }
  22. printf("client say:%s\n",buf);
  23. if(strncmp(buf,"sl",2) == 0)
  24. {
  25. printf("train running...\n");
  26. system("sl");
  27. }
  28. }
  29. }

主函数代码: 

  1. //主函数
  2. int main(int argc, char *argv[])
  3. {
  4. int connfd; //通信套接字
  5. int listenfd; //监听套接字
  6. listenfd = init_sever(IP,PORT,BACKLOG); //调用套接字的创建等功能函数
  7. if(-1 == listenfd)
  8. {
  9. perror("init failed..");
  10. exit(-1);
  11. }
  12. printf("init success\n");
  13. while(1)
  14. {
  15. struct sockaddr_in addr;
  16. socklen_t len = sizeof(addr);
  17. connfd = accept(listenfd,(struct sockaddr *)&addr,&len);
  18. if(-1 == connfd)
  19. {
  20. perror("accept");
  21. exit(-1);
  22. }
  23. printf("pthread num:%d---client ip:%s---client port:%d\n",connfd-3,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
  24. pthread_t tid; //创建线程
  25. pthread_create(&tid,NULL,client_con,(void *)&connfd); //创建线程并调用通信模块,将通信套接字的信息给到该函数;
  26. pthread_detach(tid); //非阻塞,子线程结束,回收资源
  27. }
  28. close(listenfd);
  29. return 0;
  30. }

 

线程相关函数:

pthread_t pid;        //获取一个线程号

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

参数说明:thread:线程号

                   attr:线程的的属性,一般置为NULL,表示默认属性;

                    第三个是回掉函数,线程所要执行的功能;

                    第四个是回掉函数的参数;

pthread_detach();无阻塞回收结束的子进程的函数

pthread_join();阻塞回收结束的子进程的函数

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号