LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 622|回复: 0

一个程序,希望高手们帮忙看看是哪出错了

[复制链接]
发表于 2004-11-22 11:36:26 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/epoll.h>
#include <string.h>
int main(int argc,char *argv[])
{
       printf("This is begining...\n");
       int server_sockfd, client_sockfd,listener;
       int server_len, client_len,nfds,epollfd;
       struct sockaddr_in server_address;
       struct sockaddr_in client_address;
       epollfd=epoll_create(100);
       if(epollfd<0)
       {
             printf("epoll create failue\n");
             exit(1);
       }
       printf("create %d\n",epollfd);
       server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
       server_address.sin_family=AF_INET;
       server_address.sin_addr.s_addr=htonl(INADDR_ANY);
       server_address.sin_port=htons( 9734);
       server_len=sizeof(server_address);
       client_len=sizeof(client_address);

       if(bind(server_sockfd,(struct sockaddr *)&server_address,server_len)!=0)
      {
             printf("There are wrong for socket and port!\n");
             exit(1);
      }
      listener=listen(server_sockfd,64);
      if(listener!=0)
     {
             printf("listen is wrong!\n");
             exit(1);
      }
      struct epoll_event ev;
      client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address,&client_len);
      if(client_sockfd < 0)
     {
             perror("accept");
             exit(1);
     }
     ev.events = EPOLLIN | EPOLLET;
     ev.data.fd = client_sockfd;

     printf("Use epoll_ctl\n");
     int n=epoll_ctl(epollfd, EPOLL_CTL_ADD, client_sockfd, &ev);

     if ( n < 0)
     {
             fprintf(stderr, "epoll set insertion error: fd=%d\n",client_sockfd);
             return -1;
      }
      printf("hehe %d\n",client_sockfd);
      printf("hahahah %d\n",ev.data.fd);
      while(1)
     {
            struct epoll_event *events;
            nfds = epoll_wait(epollfd, (struct epoll_event *)events, 1, 1000);
            switch(nfds)
            {
                 case 0:
                       printf("No event .. timout instead\n");
                       exit(1);
                      //break;
                case -1:
                      break;
                default:
                      if(events[0].data.fd==client_sockfd)
                      {
                              char buffer[2048],data[2048]="This is test!";
                              recv(client_sockfd,(void *)buffer,2048,NULL);
                              printf("%s\n",buffer);
                              send(client_sockfd,(void *)data,2048,NULL);
                              printf("Server wait the next...");
                              strcpy(buffer,"");
                              strcpy(data,"");
                              fflush(stdout);
                       }
                       break;
              }
      }
      return 0;
}
是一个socket程序,但是用到了内核的加速补丁epoll,可是当epoll_wait始终等待不到任务,导致每次都是返回0。这样我应该怎么去改呢,在网上找遍了也没找到解决的办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表