免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2272 | 回复: 4
打印 上一主题 下一主题

Linux多线程求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-19 02:28 |只看该作者 |倒序浏览
现在有一段比较恶搞和无聊的程序,纯属是新手练手,虽然程序的功能没有什么意义,但是有个问题,需要大家指点。请大家看看:
  1. /*
  2. * psc.c
  3. *
  4. *  Created on: 2010-10-19
  5. *      Author: hacker
  6. */
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <stdio.h>
  12. #include <unistd.h>
  13. #include <pthread.h>
  14. #include <stdlib.h>

  15. void client();

  16. int main()
  17. {

  18.         int server_sockfd, client_sockfd;//保存服务器和客户端套接字标识
  19.         int server_len, client_socklen;//保存服务器和客户端消息长度
  20.         struct sockaddr_in server_address;//定义服务器套接字地址
  21.         struct sockaddr_in client_address;//定义客户端套接字地址
  22.         server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//定义套接字类型
  23.         server_address.sin_family = AF_INET;//定义套接字地址中的域
  24.         server_address.sin_addr.s_addr = inet_addr("127.0.0.1");//定义套接字地址
  25.         server_address.sin_port = 9734;//定义套接字端口
  26.         server_len = sizeof(server_address);
  27.         bind(server_sockfd, (struct sockaddr*) &server_address,server_len);
  28.                                                                                 //定义套接字名字
  29.         listen(server_sockfd,5);//创建套接字列队
  30.         while(1){
  31.                 char ch;
  32.                 printf("服务器等待消息...\n");
  33.                 client_socklen = sizeof(client_address);
  34.                 client_sockfd = accept(server_sockfd,        //接收连接
  35.                                 (struct sockaddr*)&client_address,
  36.                                 (socklen_t *__restrict) &client_socklen);
  37.                 read(client_sockfd,&ch,1);//读取客户端连接
  38.                 ch++;
  39.                 write(client_sockfd,&ch,1);//向客户端传送消息
  40.                 close(client_sockfd);
  41.         }

  42.         while(1){
  43.                 pthread_t client_p;
  44.                 void * thread_result;
  45.                 pthread_create(&client_p, NULL, (void*)client, NULL);
  46.                 if(client_p != 0)
  47.                 {
  48.                         perror("线程创建失败");
  49.                         exit(EXIT_FAILURE);
  50.                 }
  51.                 pthread_join(client_p,&thread_result);
  52.         }
  53.         return 0;
  54. }


  55. void client()
  56. {
  57.         int sockfd;
  58.                 int len;
  59.                 struct sockaddr_in address;
  60.                 int result;
  61.                 char ch = 'A';
  62.                 sockfd = socket(AF_INET, SOCK_STREAM, 0);
  63.                 address.sin_family = AF_INET;
  64.                 address.sin_addr.s_addr = inet_addr("127.0.0.1");
  65.                 address.sin_port = 9734;
  66.                 len = sizeof(address);
  67.                 result = connect(sockfd,(struct sockaddr*) &address,len);
  68.                 if(result == -1){
  69.                         perror("连接失败");
  70.                         return 1;
  71.                 }
  72.                 write(sockfd, &ch, 1);
  73.                 read(sockfd, &ch, 1);
  74.                 printf("来自服务器的消息是%c\n",ch);
  75.                 close(sockfd);
  76. }
复制代码
现在的问题是,主线程是一个死循环,但是主线程(server)必须先开启,然后开启另一个线程(client)。怎么才能实现呢?

论坛徽章:
0
2 [报告]
发表于 2010-10-19 02:29 |只看该作者
半夜三更写代码!自己先顶一下!

论坛徽章:
0
3 [报告]
发表于 2010-10-19 10:58 |只看该作者
server 侦听部分,也用线程实现,不就行了

论坛徽章:
0
4 [报告]
发表于 2010-10-19 13:17 |只看该作者
服务端和创建客户端不要放在一个线程就好了

论坛徽章:
0
5 [报告]
发表于 2010-10-19 17:44 |只看该作者
服务端和创建客户端不要放在一个线程就好了
wzypunk 发表于 2010-10-19 13:17



    说的对~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP