Приветствую всех.
Я делаю многопоточный www-сканер ANSI C (совместимый с HTTP 1.1) в Linux 2.6.29-3.ydl61.3 и довольно хорошо продвинулся.У меня есть 000 доменов в базе данных MySQL для сбора страниц.При желании я могу открыть любые / все домены в сканере в режиме keep-alive.Я использую многопоточность POSIX, и нет никаких конфликтов или гонок за данными.
В то время как целевые серверы кажутся готовыми разрешить мне выполнять несколько одновременных или последовательных запросов для страниц на каждом сокете сервера (так как каждый сервер возвращает 'Connection:Keep-Alive ', как и ожидалось), на самом деле я не могу этого сделать ... я могу получить только одну страницу на соединение с сокетом ... т.е. я могу записать типичный HTTP-запрос GET в сокет через дескриптор файла и прочитать ответ,Тогда сразу после этого я могу только писать в ФД, НО НЕ читать больше!Поэтому, хотя у меня есть несколько (несколько сотен) URL-адресов для каждого домена ... кажется, что мне нужно постоянно воссоздавать сокет-соединения с одними и теми же серверами для каждой записи / чтения (крайне бесполезно и медленно), а не создавать только одно клиентское TCP-соединениеи продолжайте использовать fd / socket, пока я не закончу с доменом.
См. Ниже частичный вывод 'netstat --inet -a' (обратите внимание, что как нежелательное, у меня есть несколько локальных подключений сокетов к одному домену - они не параллельны для домена):
tcp 0 0 gcell1: 38614 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell1: 34678 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 34768 x2web02.myhosting.com:http CLOSE_60 060 tp: 085 www. gtp.hihostels.com:http CLOSE_WAIT tcp 0 0 gcell11: 34661 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 34785 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 46660 67.2htp.164: 34697 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 37510 www.kenic.or.ke:http CLOSE_WAIT tcp 0 0 gcell11: 37516 www.kenic.or.ke:http CLOSE_WAIT tcp 0 0 gcell11: 34710 x2myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 34711 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 46677 67.225.194.54:http CLOSE_WAIT tcp 0 0 gcell11: 56513 www.kenic.p.t_t_ke:hcp 0 0 gcell11: 57560 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 46634 67.225.194.54:http CLOSE_WAIT tcp 0 0 gcell11: 46607 67.225.194.54:http CLOSE_WAIT tcp 0,66 0,64 0,64 0,611: 0,667tcp 0 0 gcell11: 37526 www.kenic.or.ke:http CLOSE_WAIT tcp 0 0 gcell11: 46673 67.225.194.54:http CLOSE_WAIT tcp 0 0 gcell11: 34736 x2web02.myhosting.com:http CLOSE_WAIT tcb 075 0 x 0 0 0 0 0 0 0myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 56395 www.kenic.or.ke:http CLOSE_WAIT tcp 0 0 gcell11: 34714 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 34669 x2web02.phohost.comtcp 0 0 gcell11: 34767 x2web02.myhosting.com:http CLOSE_WAIT tcp 0 0 gcell11: 43381 ip-72-167-251-99.ip.se:http CLOSE_WAIT
Сокет клиента создается следующим образом (только частичный код)
if((http_socket_fd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP))!=SKMG_FAILURE) //typical
...
fcntl(http_socket_fd,SOCK_NONBLOCK); //set to non-block
...
setsockopt(http_socket_fd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen); //local TCP keep-alive used
...
while(connect(http_socket_fd, (struct sockaddr *)&http_name, sizeof (struct sockaddr_in)) == (-1))
...
return http_socket_fd;
После этого я просто использую запись / чтение на fd.И это прекрасно работает, НО ТОЛЬКО для одного туда-обратно.
1) Как я могу использовать http_socket_fd
для каждой HTTP GET записи / чтения для домена без необходимости создавать новый локальный сокет TCP для каждого URL ??Простая передача http_socket_fd
каждому вызову выборки страниц для домена - это именно то, что не работает.[КРИТИЧЕСКИЙ]
2) Как я могу делать асинхронные запросы к этим серверам в этом одном потоке на сокет для каждой парадигмы домена?Я запускаю 4 параллельных потока (мой сервер является двухпоточным), то есть 4 разных одновременных выборки домена.[СТАНДАРТНЫЕ]