免费注册 查看新帖 |

Chinaunix

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

奇怪了 此tcp服务器不输出任何东西奇怪了 跪求高手帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-10 23:38 |只看该作者 |倒序浏览
本帖最后由 cu-superstar 于 2011-12-11 16:07 编辑

网上别人写的一段代码 复制即可编译 但我测试的时候编译可以通过 执行后却不输出任何东西 至少那些提示信息要输出吧!
printf("server running:port[%d]/n", port);  //连这句都没输出 我就奇了怪了
  1. //   

  2. #include <sys/socket.h>   
  3. #include <sys/epoll.h>   
  4. #include <netinet/in.h>   
  5. #include <arpa/inet.h>   
  6. #include <fcntl.h>   
  7. #include <unistd.h>   
  8. #include <stdio.h>   
  9. #include <errno.h>   
  10. #include <iostream>   
  11. using namespace std;  
  12. #define MAX_EVENTS 500   
  13. struct myevent_s  
  14. {  
  15.     int fd;  
  16.     void (*call_back)(int fd, int events, void *arg);  
  17.     int events;  
  18.     void *arg;  
  19.     int status; // 1: in epoll wait list, 0 not in   
  20.     char buff[128]; // recv data buffer   
  21.     int len;  
  22.     long last_active; // last active time   
  23. };  
  24. // set event   
  25. void EventSet(myevent_s *ev, int fd, void (*call_back)(int, int, void*), void *arg)  
  26. {  
  27.     ev->fd = fd;  
  28.     ev->call_back = call_back;  
  29.     ev->events = 0;  
  30.     ev->arg = arg;  
  31.     ev->status = 0;  
  32.     ev->last_active = time(NULL);  
  33. }  
  34. // add/mod an event to epoll   
  35. void EventAdd(int epollFd, int events, myevent_s *ev)  
  36. {  
  37.     struct epoll_event epv = {0, {0}};  
  38.     int op;  
  39.     epv.data.ptr = ev;  
  40.     epv.events = ev->events = events;  
  41.     if(ev->status == 1){  
  42.         op = EPOLL_CTL_MOD;  
  43.     }  
  44.     else{  
  45.         op = EPOLL_CTL_ADD;  
  46.         ev->status = 1;  
  47.     }  
  48.     if(epoll_ctl(epollFd, op, ev->fd, &epv) < 0)  
  49.         printf("Event Add failed[fd=%d]/n", ev->fd);  
  50.     else  
  51.         printf("Event Add OK[fd=%d]/n", ev->fd);  
  52. }  
  53. // delete an event from epoll   
  54. void EventDel(int epollFd, myevent_s *ev)  
  55. {  
  56.     struct epoll_event epv = {0, {0}};  
  57.     if(ev->status != 1) return;  
  58.     epv.data.ptr = ev;  
  59.     ev->status = 0;  
  60.     epoll_ctl(epollFd, EPOLL_CTL_DEL, ev->fd, &epv);  
  61. }  
  62. int g_epollFd;  
  63. myevent_s g_Events[MAX_EVENTS+1]; // g_Events[MAX_EVENTS] is used by listen fd   
  64. void RecvData(int fd, int events, void *arg);  
  65. void SendData(int fd, int events, void *arg);  
  66. // accept new connections from clients   
  67. void AcceptConn(int fd, int events, void *arg)  
  68. {  
  69.     struct sockaddr_in sin;  
  70.     socklen_t len = sizeof(struct sockaddr_in);  
  71.     int nfd, i;  
  72.     // accept   
  73.     if((nfd = accept(fd, (struct sockaddr*)&sin, &len)) == -1)  
  74.     {  
  75.         if(errno != EAGAIN && errno != EINTR)  
  76.         {  
  77.             printf("%s: bad accept", __func__);  
  78.         }  
  79.         return;  
  80.     }  
  81.     do  
  82.     {  
  83.         for(i = 0; i < MAX_EVENTS; i++)  
  84.         {  
  85.             if(g_Events[i].status == 0)  
  86.             {  
  87.                 break;  
  88.             }  
  89.         }  
  90.         if(i == MAX_EVENTS)  
  91.         {  
  92.             printf("%s:max connection limit[%d].", __func__, MAX_EVENTS);  
  93.             break;  
  94.         }  
  95.         // set nonblocking   
  96.         if(fcntl(nfd, F_SETFL, O_NONBLOCK) < 0) break;  
  97.         // add a read event for receive data   
  98.         EventSet(&g_Events[i], nfd, RecvData, &g_Events[i]);  
  99.         EventAdd(g_epollFd, EPOLLIN|EPOLLET, &g_Events[i]);  
  100.         printf("new conn[%s:%d][time:%d]/n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), g_Events[i].last_active);  
  101.     }while(0);  
  102. }  
  103. // receive data   
  104. void RecvData(int fd, int events, void *arg)  
  105. {  
  106.     struct myevent_s *ev = (struct myevent_s*)arg;  
  107.     int len;  
  108.     // receive data   
  109.     len = recv(fd, ev->buff, sizeof(ev->buff)-1, 0);   
  110.     EventDel(g_epollFd, ev);  
  111.     if(len > 0)  
  112.     {  
  113.         ev->len = len;  
  114.         ev->buff[len] = '\0';  
  115.         printf("C[%d]:%s/n", fd, ev->buff);  
  116.         // change to send event   
  117.         EventSet(ev, fd, SendData, ev);  
  118.         EventAdd(g_epollFd, EPOLLOUT|EPOLLET, ev);  
  119.     }  
  120.     else if(len == 0)  
  121.     {  
  122.         close(ev->fd);  
  123.         printf("[fd=%d] closed gracefully./n", fd);  
  124.     }  
  125.     else  
  126.     {  
  127.         close(ev->fd);  
  128.         printf("recv[fd=%d] error[%d]:%s/n", fd, errno, strerror(errno));  
  129.     }  
  130. }  
  131. // send data   
  132. void SendData(int fd, int events, void *arg)  
  133. {  
  134.     struct myevent_s *ev = (struct myevent_s*)arg;  
  135.     int len;  
  136.     // send data   
  137.     len = send(fd, ev->buff, ev->len, 0);  
  138.     ev->len = 0;  
  139.     EventDel(g_epollFd, ev);  
  140.     if(len > 0)  
  141.     {  
  142.         // change to receive event   
  143.         EventSet(ev, fd, RecvData, ev);  
  144.         EventAdd(g_epollFd, EPOLLIN|EPOLLET, ev);  
  145.     }  
  146.     else  
  147.     {  
  148.         close(ev->fd);  
  149.         printf("recv[fd=%d] error[%d]/n", fd, errno);  
  150.     }  
  151. }  
  152. void InitListenSocket(int epollFd, short port)  
  153. {  
  154.     int listenFd = socket(AF_INET, SOCK_STREAM, 0);  
  155.     fcntl(listenFd, F_SETFL, O_NONBLOCK); // set non-blocking   
  156.     printf("server listen fd=%d/n", listenFd);  
  157.     EventSet(&g_Events[MAX_EVENTS], listenFd, AcceptConn, &g_Events[MAX_EVENTS]);  
  158.     // add listen socket   
  159.     EventAdd(epollFd, EPOLLIN|EPOLLET, &g_Events[MAX_EVENTS]);  
  160.     // bind & listen   
  161.     sockaddr_in sin;  
  162.     bzero(&sin, sizeof(sin));  
  163.     sin.sin_family = AF_INET;  
  164.     sin.sin_addr.s_addr = INADDR_ANY;  
  165.     sin.sin_port = htons(port);  
  166.     bind(listenFd, (const sockaddr*)&sin, sizeof(sin));  
  167.     listen(listenFd, 5);  
  168. }  
  169. int main(int argc, char **argv)  
  170. {  
  171.     short port = 12345; // default port   
  172.     if(argc == 2){  
  173.         port = atoi(argv[1]);  
  174.     }  
  175.     // create epoll   
  176.     g_epollFd = epoll_create(MAX_EVENTS);  
  177.     if(g_epollFd <= 0) printf("create epoll failed.%d/n", g_epollFd);  
  178.     // create & bind listen socket, and add to epoll, set non-blocking   
  179.     InitListenSocket(g_epollFd, port);  
  180.     // event loop   
  181.     struct epoll_event events[MAX_EVENTS];  
  182.     printf("server running:port[%d]/n", port);  //连这句都没输出 我就奇了怪了
  183.     int checkPos = 0;  
  184.     while(1){  
  185.         // a simple timeout check here, every time 100, better to use a mini-heap, and add timer event   
  186.         long now = time(NULL);  
  187.         for(int i = 0; i < 100; i++, checkPos++) // doesn't check listen fd   
  188.         {  
  189.             if(checkPos == MAX_EVENTS) checkPos = 0; // recycle   
  190.             if(g_Events[checkPos].status != 1) continue;  
  191.             long duration = now - g_Events[checkPos].last_active;  
  192.             if(duration >= 60) // 60s timeout   
  193.             {  
  194.                 close(g_Events[checkPos].fd);  
  195.                 printf("[fd=%d] timeout[%d--%d]./n", g_Events[checkPos].fd, g_Events[checkPos].last_active, now);  
  196.                 EventDel(g_epollFd, &g_Events[checkPos]);  
  197.             }  
  198.         }  
  199.         // wait for events to happen   
  200.         int fds = epoll_wait(g_epollFd, events, MAX_EVENTS, 1000);  
  201.         if(fds < 0){  
  202.             printf("epoll_wait error, exit/n");  
  203.             break;  
  204.         }  
  205.         for(int i = 0; i < fds; i++){  
  206.             myevent_s *ev = (struct myevent_s*)events[i].data.ptr;  
  207.             if((events[i].events&EPOLLIN)&&(ev->events&EPOLLIN)) // read event   
  208.             {  
  209.                 ev->call_back(ev->fd, events[i].events, ev->arg);  
  210.             }  
  211.             if((events[i].events&EPOLLOUT)&&(ev->events&EPOLLOUT)) // write event   
  212.             {  
  213.                 ev->call_back(ev->fd, events[i].events, ev->arg);  
  214.             }  
  215.         }  
  216.     }  
  217.     // free resource   
  218.     return 0;  
  219. }   
复制代码

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
2 [报告]
发表于 2011-12-12 14:40 |只看该作者
看看你的这上面初始化 还是 其他函数调用的部分..

打印下信息看看,就知道到哪个函数卡主了,另外 注意加一些出错处理。。。。写得很不规范啊


    g_epollFd = epoll_create(MAX_EVENTS);  
    if(g_epollFd <= 0) printf("create epoll failed.%d/n", g_epollFd);  
    // create & bind listen socket, and add to epoll, set non-blocking   
    InitListenSocket(g_epollFd, port);  
    // event loop   
    struct epoll_event events[MAX_EVENTS];
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP