免费注册 查看新帖 |

Chinaunix

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

关于tcp服务器无法连接的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-06 09:58 |只看该作者 |倒序浏览
写了一个TCP服务器程序 同时在线一般为400个客户左右
工作大约2个星期后 就会出现客户无法连接的情况,而且越来越严重,程序并没有崩溃。

我应该从什么地方来查找问题呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-09-06 10:02 |只看该作者
从服务端查,看accept是否正常

论坛徽章:
0
3 [报告]
发表于 2010-09-06 10:28 |只看该作者
接收部分的代码 不知道哪里会出现问题
while(1)
  {
    enums = epoll_wait(epollfd, events, listenq, 20);
    if (enums == -1)
    {
        printf("errno=%d,%s\r\n",errno,strerror(errno));
        if(errno==EINTR)
        {
            continue;
        }
        perror("epoll_wait");
    }
    else if(enums==0)
    {
        continue;
    }
    for (n = 0; n < enums; ++n) {
      listen_index=events[n].data.u32;
      if (events[n].data.fd == LGWTCPSock) {
        Newfd = accept(LGWTCPSock, (struct sockaddr *) &TheirAddr,&len);
        if (Newfd < 0) {
          perror("accept");
          continue;
        }
        else
        {
          //printf("recv from: %s:%d,  socket:%d enmus:%d\n", inet_ntoa(TheirAddr.sin_addr), ntohs(TheirAddr.sin_port), Newfd,enums);
        }
        setnonblocking(Newfd);
        ev.events = EPOLLIN | EPOLLET;
        ev.data.fd = Newfd;
        if (epoll_ctl(epollfd, EPOLL_CTL_ADD, Newfd, &ev) < 0) {
          fprintf(stderr, " socket '%d' add epoll error! %s\n",Newfd, strerror(errno));
          return -1;
        }
      }
      else if(events[n].events & EPOLLIN)
      {
        for(j=0;j<MAXTHREAD;j++)
        {
          if(0==s_thread_para[j][0]) break;
        }
        if(j>MAXTHREAD)
        {
          LOG4CPLUS_INFO(log.GetLogInstance(),"thread pool is full!\n");
          close(Newfd);
          continue;
        }
        pthread_mutex_lock(&mutex);
        s_thread_para[j][0]=1;
        s_thread_para[j][1]=events[n].data.fd;
        pthread_mutex_unlock(&mutex);
        pthread_mutex_unlock(s_mutex+j);
      }
    }
  }

论坛徽章:
0
4 [报告]
发表于 2010-09-06 11:15 |只看该作者
还有人帮忙看看么

论坛徽章:
0
5 [报告]
发表于 2010-09-06 11:30 |只看该作者
接收部分的代码 不知道哪里会出现问题
while(1)
  {
    enums = epoll_wait(epollfd, events, listenq ...
usbzip 发表于 2010-09-06 10:28



    把你的accept放入一个循环里,ET模式下, 多个syn请求到来到队列里也只是通知一次。 要循环accept直到返回0.

论坛徽章:
0
6 [报告]
发表于 2010-09-06 13:17 |只看该作者
什么叫做无法连接?是连上去无反应一直等待?还是连上去马山被断开?

服务器端有些什么日志出来?

系统CPU是否到瓶颈?内存是否到瓶颈?打开的fd数量是否到瓶颈?是否有资源泄露?

论坛徽章:
0
7 [报告]
发表于 2010-09-06 13:23 |只看该作者
for (n = 0; n < enums; ++n)
这里的For就是在循环接收多个请求啊。
我搜索一下例子看大家也是这么写的

论坛徽章:
0
8 [报告]
发表于 2010-09-06 13:31 |只看该作者
什么叫做无法连接?是连上去无反应一直等待?还是连上去马山被断开?

服务器端有些什么日志出来?

系统 ...
drangon 发表于 2010-09-06 13:17

说的有理 我再排查一下

论坛徽章:
0
9 [报告]
发表于 2010-09-06 13:37 |只看该作者
回复 7# usbzip


    nono   我曾经遇到同样的问题。就是那样解决的。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
10 [报告]
发表于 2010-09-06 13:40 |只看该作者
for (n = 0; n < enums; ++n)
这里的For就是在循环接收多个请求啊。
我搜索一下例子看大家也是这么写的
usbzip 发表于 2010-09-06 13:23



    这个enums不是连接请求数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP