Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сокетный движок. [D7, WinXP]


Константин Эдуардович ©   (2004-10-06 19:33:00) 

После не слишком продолжительного изучения документации по работе с 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:80HTTP/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;


Константин Эдуардович   (2004-10-11 14:47:00) [1]

Я надеяцца, что про меня не забыть? :)


Константин Эдуардович   (2004-10-09 15:36:00) [2]

serg128Я буду ждать в понедельник.

>> А вообще ищи на этом сайте в кладовке пример прокси-сервера. Там именно то, что тебе нужно.

Я вообщето клиент пишу, но и исходники сервера тоже интересно взглянуть.


serg128   (2004-10-09 14:50:00) [3]

могу дать, но в понедельник. А вообще ищи на этом сайте в кладовке пример прокси-сервера. Там именно то, что тебе нужно.


Константин Эдуардович   (2004-10-09 09:15:00) [4]

Я уже пересмотрел огромное количестов чужих исходников, в том числе и TClientSocket. Но вот как реализовать правильно пул сокетов, ну не знаю. Вся проблема и заключается в том, что я не могу корректно сделать этот долбанный пул.

Дайте пример. Пожалуйста.

Я уже верёвку с мылом приготовил, голова скоро лопнит.


Digitman   (2004-10-07 17:47:00) [5]


> А хотелось бы пример посмотреть


нет, ну а что такое "пример" ? тебе он для чего нужен ? для понимания, какие ф-ции , с какими параметрами, в какой последовательности и при каких обст-вах должны вызываться ? так ведь код упомянутого компонента и есть самый что ни на есть наглядный пример !

установи для начала св-во ClientType = ctBlocking и необх-мые св-ва Host/Address/Port/Service, вызови последовательно ф-ции Open, SendText, ReceiveBuf () и либо визуально либо трассировкой проследи, что и как происходит ... наглядней уж некуда ...


Константин Эдуардович   (2004-10-07 16:55:00) [6]

Да, посещала, но там ведь именно изучать надо. (я и его изучать буду) А хотелось бы пример посмотреть. Может проще уж пример мне дать. Очень нужно.


Digitman   (2004-10-07 15:16:00) [7]


> Я думаю сможете мне пример дать


а гадостная мысленка исследовать детально исх.текст известного штатного компонента TClientSocket твою светлую голову не посещала разве ?


Константин Эдуардович   (2004-10-07 13:45:00) [8]

я знаю, что муть.
Сейчас вот реально буду пробовать на одном гнезде. Просто я щас даже с одним могу мути накостылять. Я думаю сможете мне примердать. Пожалуйста!


Digitman   (2004-10-07 08:16:00) [9]

муть ..

ты бы хоть сначала на одном гнезде всю эту петрушку попробовал-пощупал-потрассировал, а уж потом за циклы с кучей гнезд брался ...

виснет, говоришь ? а отладчик встроенный на что ?


Константин Эдуардович   (2004-10-07 07:09:00) [10]

Нет, во первых приложение подвисает, но я думаю это из за неправилно организованных циклов (?)
А во вторых, я хоть приблизительно правильно делаю, или у меня откровенная муть?


Rouse_   (2004-10-06 20:47:00) [11]

Так а где застрял то? Все используемые тобой функции возвращают результат, вот и анализируй его...


Наверх

Титульная страница Поиск, карта сайта Написать письмо