发博文
cugb_cat

rainlx.blog.chinaunix.net

咱只谈技术   
个人资料
  • 博客访问:207218
  • 博文数量:75
  • 博客积分:4004
  • 博客等级:中校
  • 关注人气: 2
  • 注册时间:2006-09-30 15:43:33
订阅我的博客
  • 订阅
  • 订阅到鲜果
  • 订阅到抓虾
  • 订阅到Google
字体大小: 博文
分类: 网络技术

#include <stdio.h>

#include <stdint.h>

#include <unistd.h>

#include <fcntl.h>

#include <string.h>

#include <strings.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <stdlib.h>

#include <errno.h>

#include <sys/epoll.h>



#define MAXSOCKFDNUM     100

#define TIMEOUT            (20 * 1000)

#define HTTP_REQ "GET /us/ HTTP/1.1\r\nHost: www.ibm.com:80\r\nUser-Agent: wget\r\nAccept: text/xml,text/html;*/*\r\n\r\n"



struct epoll_datas

{

    struct sockaddr servaddr;

    int                sockfd;

};

struct epoll_datas datas[MAXSOCKFDNUM];



int main(int argc, char *argv[])

{

    struct sockaddr_in     *st_in;

    //int     sockfds[MAXSOCKFDNUM], flags;


    char     buffer[1000];

    int     recvlen;

    int dstport, n, flags;



    int                    error = 0, i;

    socklen_t            len;

    int                    epoll_handle;

    struct epoll_event    ev;

    struct epoll_event    events[MAXSOCKFDNUM * 2];

    char                *ptr = NULL;

    int                    ret;

    char                ip_str_ret[20];

    FILE                *fp;

    int                    ipnum;

    int                    num = 0;

    

    memset(events, 0, sizeof(events));

    fp = fopen("/tmp/ip_list.txt", "r");

    if (fp == NULL) {

        perror("fopen");

        return 0;

    }

    if ((epoll_handle = epoll_create(MAXSOCKFDNUM)) == -1) {

        perror("epoll_create");

        return 0;

    }



    ipnum = 0;

    for (i = 0; i < MAXSOCKFDNUM; i++) {

        if (fgets(buffer, sizeof(buffer), fp) == NULL) {

            break;

        }

        ipnum++;

        datas[i].sockfd = socket(AF_INET, SOCK_STREAM, 0);

        if (datas[i].sockfd < 0) {

            perror("socket");

            return 0;

        }

        flags = fcntl(datas[i].sockfd, F_GETFL, 0);

        if (flags == -1) {

            perror("fcntl");

            return 0;

        }

        fcntl(datas[i].sockfd, F_SETFL, flags | O_NONBLOCK);



        ev.events = EPOLLIN | EPOLLOUT | EPOLLET;

        ev.data.ptr = &(datas[i]);

        if (epoll_ctl(epoll_handle, EPOLL_CTL_ADD, datas[i].sockfd, &ev) < 0) {

            perror("epoll_ctl");

            return 0;

        }



        st_in = (struct sockaddr_in *)&datas[i].servaddr;

        bzero(st_in, sizeof(datas[i].servaddr));

        st_in->sin_family = AF_INET;

        ptr = strchr(buffer, ':');

        *ptr = '\0';

        ptr++;

        sscanf(ptr, "%d", &dstport);

        st_in->sin_port = htons(dstport);



        inet_pton(AF_INET, buffer, &st_in->sin_addr);

        //printf("connect to %s:%d....\n", str, dstport);


        if ((n = connect(datas[i].sockfd, &datas[i].servaddr, sizeof(datas[i].servaddr))) < 0) {

            if (errno != EINPROGRESS) {

                perror("connect");

                return 0;

            }

        }



        if (n == 0) {

            //printf("connect finished...\n");


            sprintf(buffer, HTTP_REQ);

            if (send(datas[i].sockfd, buffer, strlen(buffer), 0) < 0) {

                perror("send");

                return 0;

            }

            ev.events = EPOLLIN | EPOLLET;

            ev.data.ptr = &(datas[i]);

            epoll_ctl(epoll_handle, EPOLL_CTL_MOD, datas[i].sockfd, &ev);

        }

    }

    fclose(fp);

    

epolled:

    if ((n = epoll_wait(epoll_handle, events, MAXSOCKFDNUM * 2, TIMEOUT)) == -1) {

        perror("epoll_wait");

        return 0;

    }

    //printf("epoll_wait return %d\n", n);


    if (n == 0) {

        printf("timeout\n");

        return 0;

    }

    for (i = 0; i < n; i++) {

        if (events[i].events == EPOLLOUT) {

            //printf("EPOLLOUT\n");


            len = sizeof(error);

            if (getsockopt(((struct epoll_datas *)(events[i].data.ptr))->sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {

                perror("getsockopt");

                return 0;

            }

            if (error == 0) {

                //printf("connect finished...\n");


                sprintf(buffer, HTTP_REQ);

                if (send(((struct epoll_datas *)(events[i].data.ptr))->sockfd, buffer, strlen(buffer), 0) < 0) {

                    perror("send");

                    return 0;

                }

                ev.events = EPOLLIN | EPOLLET;

                ev.data.ptr = events[i].data.ptr;

                epoll_ctl(epoll_handle, EPOLL_CTL_MOD, ((struct epoll_datas *)(events[i].data.ptr))->sockfd, &ev);

            }

        }

        else if (events[i].events == EPOLLIN) {

            //printf("EPOLLIN\n");


            memset(buffer, 0, sizeof(buffer));

            recvlen = recv(((struct epoll_datas *)(events[i].data.ptr))->sockfd, buffer, sizeof(buffer), 0);

            st_in = (struct sockaddr_in *)&((struct epoll_datas *)(events[i].data.ptr))->servaddr;

            ptr = strchr(buffer, ' ');

            ptr++;

            sscanf(ptr, "%d", &ret);

            if (ret == 200) {

                num++;

                inet_ntop(AF_INET, &(st_in->sin_addr), ip_str_ret, 20);

                printf("%d success %s:%hu\n", num, ip_str_ret, ntohs(st_in->sin_port));

            }

#if 0

            else {

                inet_ntop(AF_INET, &st_in->sin_addr, ip_str_ret, 20);

                printf("%d failed %s:%hu\n", num, ip_str_ret, ntohs(st_in->sin_port));

            }

#endif

            //epoll_ctl(epoll_handle, EPOLL_CTL_DEL, ((struct epoll_datas *)(events[i].data.ptr))->sockfd, NULL);


            close(((struct epoll_datas *)(events[i].data.ptr))->sockfd);

        }

    }

    //printf("begin recv...\n");


    goto epolled;

    return 0;

}

[发评论] 评论 重要提示:警惕虚假中奖信息!
  • chinaunix网友 2009-06-02 17:08
    一点注释没有。
  • mingli 2007-10-29 09:21
    不错
  • cugb_cat 2007-09-30 11:30
    功能还不是全,也没做错误处理,只是表示了epoll的一种用法。
  • chinaunix网友 2007-09-29 11:51
    大致看了一下
亲,您还没有登录,请[登录][注册]后再进行评论