Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.048 c
8-1096004030
Submarine
2004-09-24 09:33
2004.12.26
Проблема с видеозахватом...


3-1101659505
Sirruf
2004-11-28 19:31
2004.12.26
Backup&Restore


14-1102493504
PRM
2004-12-08 11:11
2004.12.26
Чем открыть файл xmlsdkdoc.msm


14-1102401897
Кудесник
2004-12-07 09:44
2004.12.26
Существуют ли мелкие бесперебойники для питания свичей?


6-1097421215
Delphis
2004-10-10 19:13
2004.12.26
Поиск сервера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский