Нажмите CTRL-D чтобы добавить нас в закладки
HackZone.RU - Winsock и receiveln
Войти / Регистрация / Участники
Определение даты выпуска iPhone по серийному номеру
-
Поиск по сайту
Форумы



Реклама

Программирование / Delphi & Pascal RSS подписка на сообщения с форума Subscribe


Новая тема Наиболее обсуждаемые темы Наиболее посещаемые темы
Поиск 
Период
Перейти

Страницы сообщения: [1] [2] Просмотров - 5595
Winsock и receiveln
Добавить этот топик в закладки »
RSS-лента ответов »Subscribe
B3JIoMep




Platinum Member
# | Сообщение добавлено 02.12.2010 18:04:48
Струдом нагуглил сорц простого серва на сокетах, который просто открывает порт. В0т код сей находки:
Delphi
program Project1;
 
uses
winsock, windows;
 
var
WSAdata:TWSAdata;
sock:TSOCKET;
addr:TSockAddr;
msg:tmsg;
{$R *.res}
 
begin
WSAStartup(MAKEWORD(2,0),WSADATA);
sock:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
addr.sin_family:=PF_INET;
addr.sin_port:=htons(1111);
addr.sin_addr.S_addr:=INADDR_ANY;
bind(Sock,addr,sizeof(addr));
Listen(Sock,SOMAXCONN);
while GetMessage(Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Возникает вопрос. Как можно обработать события коннекта\дисконнекта клиента и приема текста от клиента?
 
гений, миллиардер, плейбой, филантроп)0)
Сказать спасибо Ответить Цитировать

_ruzmaz_


Gold Member
# | Сообщение добавлено 02.12.2010 19:12:05
Пример есть в мсдн
http://msdn.microsoft.com/en-us/library/ms737526(v=VS.85).aspx
ну а после закрытия сокета ListenSocket должно быть что-то типа
recv(AcceptSocket, lpTextBuffer, dwTextBufferSize, 0);
а затем обрабатывать принятые данные (в lpTextBuffer), потом ждать следующие и/или посылать что-то в ответ (используя send) и т.д.
Зачем кстати в том примере на делфи обработка сообщений (вызовы GetMessage и DispatchMessage в цикле)?
Сказать спасибо Ответить Цитировать

B3JIoMep




Platinum Member
# | Сообщение добавлено 02.12.2010 20:01:54
Для того, что бы прога постоянно висела в памяти и не закрывалась.
 
Добавлено 02.12.2010 20:10:38 (через 9 минут 44 секунды )
 
B3JIoMep

Пример есть в мсдн
http://msdn.microsoft.com/en-us/library/ms737526(v=VS.85).aspx
Это увы не дельфи...
 
Добавлено 02.12.2010 20:27:11 (через 17 минут 33 секунды )
 
Вроде разобрался. Спс!
 
Добавлено 02.12.2010 20:43:56 (через 17 минут 45 секунд )
 
Проблемка назрела. Вот весь код вместе с обработкой:
Delphi
program Project1;
 
uses
winsock, windows, dialogs;
 
var
WSAdata:TWSAdata;
sock:TSOCKET;
addr:TSockAddr;
msg:tmsg;
acceptsocket:integer;
lpTextBuffer:string;
dwtextbuffersize:integer;
i:integer;
{$R *.res}
 

begin
lpTextBuffer := '';
WSAStartup(MAKEWORD(2,0),WSADATA);
sock:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
addr.sin_family:=PF_INET;
addr.sin_port:=htons(1111);
addr.sin_addr.S_addr:=INADDR_ANY;
bind(Sock,addr,sizeof(addr));
Listen(Sock,SOMAXCONN);
for i :=1 to 1000000 do begin
recv(AcceptSocket, lpTextBuffer, dwTextBufferSize, 0);
showmessage(lpTextBuffer);
sleep(1000);
end;
while GetMessage(Msg, HInstance, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Почему то не происходит обработки. В чем причина?
 
гений, миллиардер, плейбой, филантроп)0)
Сказать спасибо Ответить Цитировать

_ruzmaz_


Gold Member
# | Сообщение добавлено 02.12.2010 20:57:53
B3JIoMep

Для того, что бы прога постоянно висела в памяти и не закрывалась.
прога будет "ждать" соединения с клиентом при вызове accept и соответственно поступления данных при вызове recv, никакие циклы и слипы не нужны.
Перед обменом данными с клиентом необходимо создать еще один сокет с помощью accept (см. мсдн) и дальше работать с ним.
Сказать спасибо Ответить Цитировать

B3JIoMep




Platinum Member
# | Сообщение добавлено 02.12.2010 21:02:51
_ruzmaz_

(см. мсдн)
Там С походу(
 
Добавлено 02.12.2010 21:08:47 (через 6 минут 56 секунд )
 
_ruzmaz_

Перед обменом данными с клиентом необходимо создать еще один сокет с помощью accept (см. мсдн) и дальше работать с ним.
Мож запостить код плз...
 
гений, миллиардер, плейбой, филантроп)0)
Сказать спасибо Ответить Цитировать

_ruzmaz_


Gold Member
# | Сообщение добавлено 02.12.2010 22:05:08
Delphi
program wsServerTest;
 
uses
  Windows, WinSock;
 
const
  dwTextBufferSize = $1000;
 
var
  WSAData:      TWSAData;
  lst_sock,
  acc_sock:     TSocket;
  addr:         TSockAddr;
  lpTextBuffer: PChar;
  data_len:     integer;
 
begin
  GetMem(lpTextBuffer, dwTextBufferSize);
  WSAStartup(MakeWord(2, 0), WSAData);
  lst_sock := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  addr.sin_family := PF_INET;
  addr.sin_port := htons(1111);
  addr.sin_addr.s_addr := INADDR_ANY;
  bind(lst_sock, addr, sizeof(addr));
  listen(lst_sock, SOMAXCONN);
  acc_sock := accept(lst_sock, nil, nil);
  data_len := recv(acc_sock, lpTextBuffer^, dwTextBufferSize - 1, 0);
  lpTextBuffer[data_len] := chr(0);
  MessageBoxA(0, lpTextBuffer, 'Message received', 0);
  closesocket(lst_sock);
  closesocket(acc_sock);
  WSACleanup();
  FreeMem(lpTextBuffer);
end.
Сказать спасибо Ответить Цитировать

B3JIoMep




Platinum Member
# | Сообщение добавлено 03.12.2010 09:23:07
Вобщем попробовал твой код. Там после первой же обработки прога закрывается. Пробовал обойти это вот так вот:
Delphi
program troyan;
 
uses
  Windows,
  WinSock;
 
const
  dwTextBufferSize = $1000;
 
var
  WSAData:      TWSAData;
  lst_sock,
  acc_sock:     TSocket;
  addr:         TSockAddr;
  lpTextBuffer: PChar;
  data_len:     integer;
  i:integer;
 

procedure remote;
begin
lpTextBuffer := '';
  GetMem(lpTextBuffer, dwTextBufferSize);
  WSAStartup(MakeWord(2, 0), WSAData);
  lst_sock := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  addr.sin_family := PF_INET;
  addr.sin_port := htons(1111);
  addr.sin_addr.s_addr := INADDR_ANY;
  bind(lst_sock, addr, sizeof(addr));
  listen(lst_sock, SOMAXCONN);
for i:=1 to 100000 do begin
  acc_sock := accept(lst_sock, nil, nil);
  data_len := recv(acc_sock, lpTextBuffer^, dwTextBufferSize - 1, 0);
lpTextBuffer[data_len] := chr(0);
if lpTextBuffer = '' then else
MessageBoxA(0, lpTextBuffer, 'Message received', 0);
end;
  closesocket(lst_sock);
  closesocket(acc_sock);
  WSACleanup();
  FreeMem(lpTextBuffer);
end;
 
begin
remote;
end
Теперь вроде бы должно обрабатываться несколько раз, но нет! Прога не закрывается, но обработка идет только 1 раз. После этого следующая обработка возможна только после переподключения клиента, что я собственно реализовал вот так:
Delphi
clientsocket1.Socket.SendText(Edit1.Text);
clientsocket1.Active:=false;
clientsocket1.Active:=true;
И казалось бы все норм, и так оно как бы и есть, но нифига( Теперь после отключения (закрытия клиента) вылазит еще 1 мессага с пустым содержанием. Как видно из исходника, это я тоже пытался обойти так - if lpTextBuffer = '' else ...   И увы нифига... Выручай...Wink
 
Добавлено 03.12.2010 21:14:05 (через 12 часов 51 минута 58 секунд )
 
up))Wink
 
гений, миллиардер, плейбой, филантроп)0)
Сказать спасибо Ответить Цитировать

_ruzmaz_


Gold Member
# | Сообщение добавлено 03.12.2010 21:33:46
B3JIoMep

Там после первой же обработки прога закрывается.
Еще бы, recv вызывается только один раз).
Модифицированный код ничего вроде, но
acc_sock := accept(lst_sock, nil, nil);
нужно вызывать один раз до цикла. Сам цикл лучше сделать через while true do и предусмотреть выход из него через break, если data_len <= 0.
Сказать спасибо Ответить Цитировать

B3JIoMep




Platinum Member
# | Сообщение добавлено 04.12.2010 16:59:47
Вроде бы сделал все так, как ты сказал... Эффект тот же. Вот код:
Delphi
program programm1;
 
uses
  Windows,
  WinSock;
 
const
  dwTextBufferSize = $1000;
 
var
  WSAData:      TWSAData;
  lst_sock,
  acc_sock:     TSocket;
  addr:         TSockAddr;
  lpTextBuffer: PChar;
  data_len:     integer;
  i:integer;
 

procedure remote;
begin
lpTextBuffer := '';
  GetMem(lpTextBuffer, dwTextBufferSize);
  WSAStartup(MakeWord(2, 0), WSAData);
  lst_sock := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  addr.sin_family := PF_INET;
  addr.sin_port := htons(1111);
  addr.sin_addr.s_addr := INADDR_ANY;
  bind(lst_sock, addr, sizeof(addr));
  listen(lst_sock, SOMAXCONN);
acc_sock := accept(lst_sock, nil, nil);
while true do begin
  acc_sock := accept(lst_sock, nil, nil);
  data_len := recv(acc_sock, lpTextBuffer^, dwTextBufferSize - 1, 0);
lpTextBuffer[data_len] := chr(0);
MessageBoxA(0, lpTextBuffer, 'Message received', 0);
end;
  closesocket(lst_sock);
  closesocket(acc_sock);
  WSACleanup();
  FreeMem(lpTextBuffer);
end;
 
begin
remote;
end.
 

 
гений, миллиардер, плейбой, филантроп)0)
Сказать спасибо Ответить Цитировать

_ruzmaz_


Gold Member
# | Сообщение добавлено 04.12.2010 19:08:41
_ruzmaz_

нужно вызывать один раз до цикла.
...нужно вызывать один раз до цикла и всё=) больше вызывать accept не надо
Сказать спасибо Ответить Цитировать

Страницы сообщения: [1] [2]
Только зарегистрированные пользователи могут оставлять сообщения в форуме

Зарегистрироваться *** Авторизоваться

 Последние новости и статьи  Последние сообщения с форумов
  • WhatsApp уверяет пользователей, что Facebook не имеет доступа к и...
  • Однострочная команда в Windows 10 может повредить жесткий диск с ...
  • Кардерский форум Joker’s Stash объявил о закрытии
  • Релиз ядра Linux 5.9
  • Российские хакеры вооружились уязвимостью Zerologon
  • Тысячи приватных звонков американских заключенных оказались в отк...
  • Шифровальщик атаковал немецкую компанию Software AG
  • Злоумышленники используют службу Windows Error Reporting для бесф...
  • Microsoft предупредила о вымогателях, которые выдают себя за МВД ...
  • Инфостилер Valak ворует информацию из почтовых систем Microsoft E...

    Все новости... Все статьи... Прислать новость RSS
  • Взлом и безопасность / Программы » Услуги Хакера @ Заказать взлом @ Нужен хакер@Alex89618506139
  • Взлом и безопасность / ICQ,AIM,YAHOO,QIP » Услуги Хакера @ Заказать взлом @ Нужен хакер@Alex89618506139
  • Взлом и безопасность / Разное » Re: Помощь в скачивании платного файла
  • Взлом и безопасность / Разное » Помощь в скачивании платного файла
  • Разное / Куплю, приму в дар » куплю | ваш аккаунта | получение нового | описание внутри
  • Разное / Предложения работы » Специалиста
  • Downloads / Другое » Re: Нужна база емайл адресов юр. лиц
  • Downloads / Другое » Нужна база емайл адресов юр. лиц
  • Разное / Предложения работы » Нужен взлом mail и gmail почты
  • Взлом и безопасность / Разное » Re: Нужна помощь в скачивании файла

    Все форумы... RSS


  • Разместить рекламу
    © HackZone Ltd. 1996-2020. Все права зарегистрированы.
    Перепечатка материалов без согласования и указания источника будет преследоваться по Закону

    О проекте | История проекта | Размещение рекламы | Обратная связь | Правила поведения на портале
    contador de visitas счетчик посещений

    #{title}

    #{text}

    x

    #{title}

    #{text}