Форум: "Сети";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизСокетный движок. Найти похожие ветки
← →
Константин Эдуардович (2004-10-06 19:33) [0]После не слишком продолжительного изучения документации по работе с winsock я морально подготовил себя к бою с ним. На примере написания сокетного движка.
Получается сказать даже не могу, что… Посмотрите код, plz, а то, может я даже и не в том направлении копаю. Обьявление некоторых переменных опустил, дабы не загромождать слишком много. Суть этого кода – коннект к прокси из списка и посылка GET, ну и дальше хотелось уже анализируя ответы сервера продолжить с ним работу. Но пока я застрял на этом. Если код совершенно ‘не в кассу”, приведите мне примеров рабочего кода, plz.
И сразу, если можно вопрос. Мне кажется, что можно написать движок с пулом сокетов и что бы каждый сокет “реагировал” на fd_read, fd_write и я уже анализируя приходящие данные отправлял исходящие. Знаю, что знаний пока маловато, но я буду стремиться в этом направлении. Желательно пример конечно, но и просто любое мнение выслушаю.
Пожалуйста!const
J_CLOSED = 0;
J_IDLE = 1;
J_CONNECTING = 2;
J_CONNECTED = 3;
J_SENT = 4;
J_FIRST = 5;
type
Tz_tmpSock = record
zSkt:Tsocket;
rc:integer;
job:byte;
tv:TTimeval;
zAddr:sockaddr_in;
fset:TFDset;
zi:integer;
end;
var
otmpSock: array [0..5] of Tz_tmpSock;
begin
WsaStartup (MAKEWORD (2,0), wsd);
for i := 0 to 5 do begin
Application.ProcessMessages;
otmpSock[i].job := J_FIRST;
otmpSock[i].tv.tv_sec := 2;
otmpSock[i].tv.tv_usec := 2;
otmpSock[i].zi := 1;
end;
while stop=false do begin
Application.ProcessMessages;
for i := 0 to 5 do begin
fd_zero(otmpSock[i].fset);
if otmpSock[i].job = J_FIRST then begin
otmpSock[i].zSkt := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
//otmpSock[i].job := J_IDLE;
ioctlsocket(otmpSock[i].zSkt, FIONBIO, otmpSock[i].zi);
ZeroMemory(@otmpSock[i].zAddr, SizeOf(otmpSock[i].zAddr));
otmpSock[i].zAddr.sin_family := AF_INET;
//ниже – установка адреса и порта прокси из списка, саму “выборку” приводить не буду
otmpSock[i].zAddr.sin_port := htons(strtoint(copy(d,x+1,v)));
otmpSock[i].zAddr.sin_addr := in_addr(inet_addr(pchar(copy(d,1,v-1))));
connect(otmpSock[i].zSkt, otmpSock[i].zAddr, SizeOf(otmpSock[i].zAddr));
FD_SET(otmpSock[i].zSkt,otmpSock[i].fset);
select(1, nil, @otmpSock[i].fset, nil, @otmpSock[i].tv);
if(FD_ISSET(otmpSock[i].zSkt ,otmpSock[i].fset)) then begin
listbox1.items.Add("connect");
otmpSock[i].job := J_CONNECTING;
end;
end;
end;
for i := 0 to 5 do begin
fd_zero(otmpSock[i].fset);
if otmpSock[i].job = J_CONNECTING then begin
FBuffer := "GET http://mail.ru:80 HTTP/1.0"+#13#10#13#10;
send(otmpSock[i].zSkt,FBuffer[1],length(FBuffer),0);
FD_SET(otmpSock[i].zSkt,otmpSock[i].fset);
select(1, nil, @otmpSock[i].fset, nil, @otmpSock[i].tv);
if(FD_ISSET(otmpSock[i].zSkt ,otmpSock[i].fset)) then begin
listbox1.items.Add("send");
otmpSock[i].job := 222;
end;
end;
end;
for i := 0 to 5 do begin
fd_zero(otmpSock[i].fset);
if otmpSock[i].job = 222 then begin
recv(otmpSock[i].zSkt, Bufa, SocketDataLength(otmpSock[i].zSkt), 0);
memo1.Lines.Add(bufa);
FD_SET(otmpSock[i].zSkt,otmpSock[i].fset);
select(1, nil, @otmpSock[i].fset, nil, @otmpSock[i].tv);
if(FD_ISSET(otmpSock[i].zSkt ,otmpSock[i].fset)) then begin
listbox1.items.Add("recv");
closesocket(otmpSock[i].zSkt);
otmpSock[i].job := J_FIRST;
end;
end;
end;
end;
function SocketDataLength(hSocket:TSocket):Integer;
begin
ioctlsocket(hSocket, FIONREAD, Longint(Result))
end;
← →
Rouse_ © (2004-10-06 20:47) [1]Так а где застрял то? Все используемые тобой функции возвращают результат, вот и анализируй его...
← →
Константин Эдуардович (2004-10-07 07:09) [2]Нет, во первых приложение подвисает, но я думаю это из за неправилно организованных циклов (?)
А во вторых, я хоть приблизительно правильно делаю, или у меня откровенная муть?
← →
Digitman © (2004-10-07 08:16) [3]муть ..
ты бы хоть сначала на одном гнезде всю эту петрушку попробовал-пощупал-потрассировал, а уж потом за циклы с кучей гнезд брался ...
виснет, говоришь ? а отладчик встроенный на что ?
← →
Константин Эдуардович (2004-10-07 13:45) [4]я знаю, что муть.
Сейчас вот реально буду пробовать на одном гнезде. Просто я щас даже с одним могу мути накостылять. Я думаю сможете мне пример дать. Пожалуйста!
← →
Digitman © (2004-10-07 15:16) [5]
> Я думаю сможете мне пример дать
а гадостная мысленка исследовать детально исх.текст известного штатного компонента TClientSocket твою светлую голову не посещала разве ?
← →
Константин Эдуардович (2004-10-07 16:55) [6]Да, посещала, но там ведь именно изучать надо. (я и его изучать буду) А хотелось бы пример посмотреть. Может проще уж пример мне дать. Очень нужно.
← →
Digitman © (2004-10-07 17:47) [7]
> А хотелось бы пример посмотреть
нет, ну а что такое "пример" ? тебе он для чего нужен ? для понимания, какие ф-ции , с какими параметрами, в какой последовательности и при каких обст-вах должны вызываться ? так ведь код упомянутого компонента и есть самый что ни на есть наглядный пример !
установи для начала св-во ClientType = ctBlocking и необх-мые св-ва Host/Address/Port/Service, вызови последовательно ф-ции Open, SendText, ReceiveBuf () и либо визуально либо трассировкой проследи, что и как происходит ... наглядней уж некуда ...
← →
Константин Эдуардович (2004-10-09 09:15) [8]Я уже пересмотрел огромное количестов чужих исходников, в том числе и TClientSocket. Но вот как реализовать правильно пул сокетов, ну не знаю. Вся проблема и заключается в том, что я не могу корректно сделать этот долбанный пул.
Дайте пример. Пожалуйста.
Я уже верёвку с мылом приготовил, голова скоро лопнит.
← →
serg128 (2004-10-09 14:50) [9]могу дать, но в понедельник. А вообще ищи на этом сайте в кладовке пример прокси-сервера. Там именно то, что тебе нужно.
← →
Константин Эдуардович (2004-10-09 15:36) [10]serg128 Я буду ждать в понедельник.
>> А вообще ищи на этом сайте в кладовке пример прокси-сервера. Там именно то, что тебе нужно.
Я вообщето клиент пишу, но и исходники сервера тоже интересно взглянуть.
← →
Константин Эдуардович (2004-10-11 14:47) [11]Я надеяцца, что про меня не забыть? :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c