免费注册 查看新帖 |

Chinaunix

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

[请教]一个客户端/服务器程序【已解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-24 15:30 |只看该作者 |倒序浏览
已解决,问题是应该在客户端线程中connect



客户端有多个线程向服务器发请求,但只能返回一个结果,或一个结果都不返回。
服务器端预先创建多个线程,各个线程各自accept。代码如下,请大家看看哪里出错了。
服务器端代码:

  1. //服务线程
  2. void *serviceThread(void *arg)
  3. {
  4.         if (pthread_detach(pthread_self()) != 0) {
  5.                 g_Log.writeLog(FA, "Thread Detach Error...");
  6.                 exit(-1);
  7.         }

  8.         g_Log.writeLog(D1, "new Service Thread");

  9.         int listenfd = *(int *)arg;
  10.         int connfd;
  11.         socklen_t clilen;
  12.         struct sockaddr cliaddr;
  13.         for ( ; ; ) {
  14.                 clilen = sizeof(cliaddr);
  15.                 pthread_mutex_lock(&g_acptLock);
  16.                 connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
  17.                 if (connfd < 0) {
  18.                         g_Log.writeLog(ER, "Accept Error...");
  19.                         pthread_mutex_unlock(&g_acptLock);
  20.                         continue;
  21.                 }
  22.                 pthread_mutex_unlock(&g_acptLock);
  23.                 doService(connfd);
  24.                 close(connfd);
  25.         }

  26.         return NULL;
  27. }

  28. void doService(int &sockfd)
  29. {
  30.          for ( ; ; ) {
  31.                    //从sockfd读数据,处理后,向sockfd写数据
  32.          }
  33. }
复制代码


客户端代码:

  1. int main(int argc, char **argv)
  2. {
  3.         // init Log
  4.         if(g_Log.init("./logs", "dnsLog", 10485760, 1) < 0){
  5.                 cerr << "Init log error!" << endl;
  6.                 exit(-1);
  7.         };

  8.         int sockfd;
  9.         struct sockaddr_in servaddr;

  10.         if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  11.                 cerr << "Socket Error" << endl;
  12.                 exit(-1);
  13.         }
  14.        
  15.         bzero(&servaddr, sizeof(servaddr));
  16.         servaddr.sin_family = AF_INET;
  17.         servaddr.sin_port = htons(8002);
  18.         if(inet_pton(AF_INET, "****", &servaddr.sin_addr) != 1) {
  19.                 cerr << "inet_pton error" << endl;
  20.                 exit(-1);
  21.         }
  22.         if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
  23.                 cerr << "Connect Error" << endl;
  24.                 exit(-1);
  25.         }


  26.         uint32_t thrdNum = 10;
  27.         pthread_t threads[thrdNum];
  28.         for (uint32_t i = 0; i < thrdNum; i++) {
  29.                 if (pthread_create(&threads[i], NULL, &requestIP, (void *)&sockfd) != 0) {
  30.                         cerr << "Thread Create Error..." << endl;
  31.                         exit(-1);
  32.                 }
  33.         }

  34.         for ( ; ; )
  35.                 pause();

  36.         return 0;
  37. }
  38. void *requestIP(void *arg)
  39. {
  40.         //向sockfd写数据,然后接收数据
  41. }
复制代码

[ 本帖最后由 litao19 于 2008-7-24 15:52 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP