📄 epoll.c
字号:
#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>
//#include "main.h"
#define MAXSOCKFDNUM 100
#define TIMEOUT (10 * 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"
#define RESULT_FILE "/tmp/success_ip.txt"
struct epoll_datas
{
struct sockaddr servaddr;
int sockfd;
};
struct epoll_datas datas[MAXSOCKFDNUM];
static int read_ip_file_flag = 0;
//static void sig_fun(int sig);
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; //*fp1;
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) {
if (errno == EINTR)
goto epolled;
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");
close(((struct epoll_datas *)(events[i].data.ptr))->sockfd);
continue;
}
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));
//printf("%d\n", i);
recvlen = recv(((struct epoll_datas *)(events[i].data.ptr))->sockfd, buffer, sizeof(buffer), 0);
if (recvlen < 0) {
perror("recv");
close(((struct epoll_datas *)(events[i].data.ptr))->sockfd);
continue;
}
st_in = (struct sockaddr_in *)&(((struct epoll_datas *)(events[i].data.ptr))->servaddr);
ptr = strchr(buffer, ' ');
if (ptr == NULL) {
close(((struct epoll_datas *)(events[i].data.ptr))->sockfd);
continue;
}
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));
}
//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");
#if 1
goto epolled;
#endif
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -