<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268569</guid>
        <pubDate>Tue, 23 Dec 2003 07:52:45 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268569</link>
        <description><![CDATA[ZEE:  &gt;<b>Петрович</b> - да совет хороший (разв што не Timer1.Active, а Timer1.Enabled)<br>но все-одно остается вопрос<br>что делать с <span style='color:navy'>sa.sin_port:=htons(0);</span> - нужный порт туда ставить или как-то потом его куда-нить присобачивать (и как) ???<br>пытаюсь делать то же что и в ScktComp.pas но ни х не получаеца (всмысле там надо конкретно порт указывать сразу - а как я говорил при этом бинд ругается и как я понял без этого бинда низя)<br>вобщем F1 plz <!--emo&:mellow:--><img src='http://forum.sources.ru/html/emoticons/mellow.gif' border='0' style='vertical-align:middle' alt='mellow.gif' /><!--endemo-->  ]]></description>
        <author>ZEE</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268136</guid>
        <pubDate>Mon, 22 Dec 2003 14:33:43 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268136</link>
        <description><![CDATA[Петрович:  <!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b>Цитата</b> </td></tr><tr><td id='QUOTE'><!--QuoteEBegin--><b>ZEE</b>, 22.12.03, 15:31<br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var rescode:integer;<br>begin<br>&nbsp; if ioctlsocket(s,FIONREAD,flag)=SOCKET_ERROR then Memo1.Lines.Add(&#39;ioctlsocket error&#39;);<br>&nbsp; rescode:=recv(s, Buffer, SizeOf(Buffer), 0);<br>&nbsp; if rescode &lt;&gt; SOCKET_ERROR then<br>&nbsp; &nbsp; Memo1.Lines.Add(Buffer);<br>end;<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd--><br>Поскольку в <b>recv</b> можно &quot;провалиться&quot; на долго (больше чем величена таймера Timer1), надо защитится от повторного входа. Да и если ошибка на сокете, то наверное вызывать <b>recv</b> не стоит. Например так:<br><!--c1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b></b> </td></tr><tr><td id='CODE'><!--ec1-->procedure TForm1.Timer1Timer&#40;Sender&#58; TObject&#41;;<br>var rescode&#58;integer;<br>begin<br>&nbsp; Timer1.Active &#58;= False;<br>&nbsp; try<br>&nbsp; &nbsp; if ioctlsocket&#40;s,FIONREAD,flag&#41;=SOCKET_ERROR then <br>&nbsp; &nbsp; &nbsp; Memo1.Lines.Add&#40;&#39;ioctlsocket error&#39;&#41;<br>&nbsp; &nbsp; else begin<br>&nbsp; &nbsp; &nbsp; rescode&#58;=recv&#40;s, Buffer, SizeOf&#40;Buffer&#41;, 0&#41;;<br>&nbsp; &nbsp; &nbsp; if rescode &#60;&#62; SOCKET_ERROR then<br>&nbsp; &nbsp; &nbsp; &nbsp; Memo1.Lines.Add&#40;Buffer&#41;;<br>&nbsp; &nbsp; end;<br>&nbsp; finally<br>&nbsp; &nbsp; Timer1.Active &#58;= True;<br>&nbsp; end;<br>end;<!--c2--></td></tr></table><div class='postcolor'><!--ec2--><br>Но в принципе, надо-бы еще определять сколько данных уже имеется в буфере WinSock и лиш только это кол-во запрашивать в <b>recv</b>. Иначе, провиснешь в нем до получения <b>SizeOf(Buffer)</b> байтов - а это может быть даже навсегда <!--emo&:)--><img src='http://forum.sources.ru/html/emoticons/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->.<br> ]]></description>
        <author>Петрович</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268057</guid>
        <pubDate>Mon, 22 Dec 2003 12:31:09 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=268057</link>
        <description><![CDATA[ZEE:  Да нашел там образцы снифферов - один вроде как более-менее понятный - от него начал отталкиаться в итоге получилась такая штука (код чуть ниже), но не могу понять что не так - в общем посмотрите и посоветуйте что исправить или заменить...<br><!--c1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b></b> </td></tr><tr><td id='CODE'><!--ec1-->uses ..., WinSock, ScktComp;<br>...<br>const<br>&nbsp; MAX_PACKET_SIZE=&#036;10000;<br>var<br>&nbsp; WSAData&#58;TWSAdata; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Инициализация WinSock<br>&nbsp; s&#58;TSocket; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Cлущающий сокет<br>&nbsp; LocalName&#58; array&#91;0..255&#93; of Char; // Имя хоста &#40;компьютера&#41;<br>&nbsp; phe&#58;PHostEnt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Информация о хосте<br>&nbsp; sa&#58;TSockAddrIn; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Адрес хоста<br>&nbsp; flag&#58;Longint = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Флаг PROMISC Вкл/выкл<br>&nbsp; Buffer&#58;array&#91;0..MAX_PACKET_SIZE&#93;of char; // Буфер для приёма данных<br>...<br>procedure TForm1.FormCreate&#40;Sender&#58; TObject&#41;;<br>begin<br>&nbsp; WSAStartup&#40;&#036;0202, WSAData&#41;;<br>&nbsp; s&#58;=socket&#40;PF_INET, SOCK_STREAM, IPPROTO_IP&#41;;<br>&nbsp; if s=INVALID_SOCKET then Memo1.Lines.Add&#40;&#39;socket error&#39;&#41;;<br>&nbsp; GetHostName&#40;LocalName, SizeOf&#40;LocalName&#41;&#41;;<br>&nbsp; phe&#58;=GetHostByName&#40;LocalName&#41;;<br>&nbsp; ZeroMemory&#40;@sa,SizeOf&#40;sa&#41;&#41;;<br>&nbsp; sa.sin_family&#58;=AF_INET;<br>&nbsp; sa.sin_port&#58;=htons&#40;0&#41;;//если ставить конкретный порт то bind&#40;&#41; потом не проходит &#58;&#40;<br>&nbsp; sa.sin_addr.s_addr&#58;=INADDR_ANY;<br>&nbsp; if bind&#40;s,sa,SizeOf&#40;sa&#41;&#41;=SOCKET_ERROR then Memo1.Lines.Add&#40;&#39;bind error&#39;&#41;;<br>&nbsp; if ioctlsocket&#40;s,FIONBIO,flag&#41;=SOCKET_ERROR then Memo1.Lines.Add&#40;&#39;ioctlsocket error&#39;&#41;;<br>&nbsp; Timer1.Enabled&#58;=true;<br>end;<br><br>procedure TForm1.Timer1Timer&#40;Sender&#58; TObject&#41;;<br>var rescode&#58;integer;<br>begin<br>&nbsp; if ioctlsocket&#40;s,FIONREAD,flag&#41;=SOCKET_ERROR then Memo1.Lines.Add&#40;&#39;ioctlsocket error&#39;&#41;;<br>&nbsp; rescode&#58;=recv&#40;s, Buffer, SizeOf&#40;Buffer&#41;, 0&#41;;<br>&nbsp; if rescode &#60;&#62; SOCKET_ERROR then<br>&nbsp; &nbsp; Memo1.Lines.Add&#40;Buffer&#41;;<br>end;<br><br>procedure TForm1.FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;<br>begin<br>&nbsp; Timer1.Enabled&#58;=false;<br>&nbsp; closesocket&#40;s&#41;;<br>&nbsp; WSACleanup;<br>end;<!--c2--></td></tr></table><div class='postcolor'><!--ec2--><br>конешна по-хорошему надо было бы не на таймер вешать, а события обрабатывать, но я с ними вобще что-т не могу разобраться...<br>и на счет sa.sin_port:=htons(0); - как после bind() прицепить сокету нужный порт или как сразу указать нужный, чтоб bind() срабатывал нормально?...<br>зы: как вы наверно заметили все сообщения и (возможные) перехваченные пакеты заносятся в Memo1 (это так для информации) ]]></description>
        <author>ZEE</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=267043</guid>
        <pubDate>Sat, 20 Dec 2003 11:23:50 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=267043</link>
        <description><![CDATA[Song:  <b>ZEE</b> <br>По-моему в FAQ по СИ я уже такое видел.<br>Там сокет вводился в прослушивающийся режим и выводил инфу в файл, этакий снифер. ]]></description>
        <author>Song</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=267034</guid>
        <pubDate>Sat, 20 Dec 2003 11:06:39 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=267034</link>
        <description><![CDATA[Testudo:  Имхо, только на более низком уровне. ]]></description>
        <author>Testudo</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=266577</guid>
        <pubDate>Fri, 19 Dec 2003 12:27:16 +0000</pubDate>
        <title>Слушаем порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=41069&amp;view=findpost&amp;p=266577</link>
        <description><![CDATA[ZEE:  Народ, тут у меня появилась необходимость определять события, когда кто-нить обращается к определенному порту моего компа.<br>Так вот, как енто сделать?<br>Можна конечно просто взять TServerSocket и через его OnAccept определять момент активности, но при этом если какя-то прога уже работает с этим портом - то этот самый TServerSocket ругается при своей активации, типа &quot;разрешено только одно использование адреса сокета&quot;<br>Как с этим бороться, а еще лучше может есть другие средства по &quot;прослушиванию&quot; портов.<br>Будет интересно узнать способы реализации сабжа. ]]></description>
        <author>ZEE</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	