QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2046|回复: 2

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

[复制链接]
发表于 2004-11-19 11:22:41 | 显示全部楼层 |阅读模式
#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。这样我应该怎么去改呢,在网上找遍了也没找到解决的办法。
发表于 2004-11-19 11:57:37 | 显示全部楼层
你应该做一些说明,这样没头没脑的叫别人如坠雾里
回复

使用道具 举报

发表于 2008-4-18 17:00:29 | 显示全部楼层
你的listenfd好像就没加进去,光在那里accept当然是没用的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 16:32 , Processed in 0.072644 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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