⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 epoll.c

📁 获得ip代理
💻 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 + -