[PHP] verbinding met irc dmv fsockopen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ik heb in PHP de volgende code geschreven om een verbinding te maken met een irc server en een channel te joinen

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<body>
<?
  $server_name = "irc.ziso.nl";
  $port_nr = 6667;
  $socket_blocking = 1;
  $password = "";

  $irc_identd = "mail";
  $irc_host = "www.webserver.com";
  $irc_realname = "My Name";

  $fp = fsockopen($server_name, $port_nr);

  if(!$socket_blocking)
    set_socket_blocking($fp, FALSE);

  fputs($fp, "USER $irc_identd $irc_host $server_name :$irc_realname\n\r");

  fputs($fp, "NICK Spiff via PHP\n\r");

  fputs($fp, "JOIN #ziso\n\r");

  fclose($fp);
?>
</body>
</html>


Ik krijg echter de volgende fout:

Warning: fputs(): supplied argument is not a valid File-Handle resource in /home/sites/site85/users/mdoornik/web/sockets/index.php on line 18

Warning: fputs(): supplied argument is not a valid File-Handle resource in /home/sites/site85/users/mdoornik/web/sockets/index.php on line 20

Warning: fputs(): supplied argument is not a valid File-Handle resource in /home/sites/site85/users/mdoornik/web/sockets/index.php on line 22

Warning: fclose(): supplied argument is not a valid File-Handle resource in /home/sites/site85/users/mdoornik/web/sockets/index.php on line 24

Ik denk dat de fout is dat het commando dat ik gebruik in fputs geen geldig commando is op de irc server, maar ik weet absoluut zeker dat dit wel klopt. Waar kan de fout in zitten?

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
AAaaahrrgg, sorry! irc.ziso.nl moest irc.ziso.net zijn |:(

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Het probleem is, dat het argument dat je meegeeft geen geldige file-handle is. (Quizz-vraag: waar leidt ik dat uit af?)

Het openen van de connectie, waarbij je je file handle krijgt, mislukt dus. Met het IRC protocol, de IRC server of jou commando's heeft het dus niets te maken, want je bent nooit verbonden met de server.

Waarom denk je trouwens dat het aan jou commando's ligt, als je naar eigen zeggen "absoluut zeker weet dat dit wel klopt"?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Ok, mag deze thread dan de annalen in gaan als een typisch voorbeeld van hoe het niet moet? Eerst zelf proberen je probleem op te lossen, door kritisch naar je eigen code en de foutmeldingen die je krijgt te kijken en dan pas een topic op GoT openen.

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Maar waarom hij het nou in een keer niet meer doet nu ik alles netjes in functies heb gezet...?
En ik heb alles grondig bekeken :P
Zoals hij bovenaan staat werkt hij, maar hier onder dus niet. Geen foutmelding, gewoon helemaal niets
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<html>
<body>
<?
  $server_name = "irc.ziso.net";
  $port_nr = 6667;
  $socket_blocking = 1;

  $irc_current_nick = "Spiff_via_PHP";
  $irc_identd = "mail";
  $irc_host = "www.webserver.com";
  $irc_realname = "My Name";

  $irc_socket_timeout = 20;
  $irc_connected = 0;

  function irc_connect($server_name, $port_nr, $socket_blocking = 1)
  {
    global $irc_connection, $irc_connected;
    global $irc_current_nick, $irc_identd, $irc_host, $server_name, $irc_realname;

    $irc_connection = fsockopen($server_name, $port_nr);

    if(!$socket_blocking)
      set_socket_blocking($irc_connection, FALSE);

    fputs($irc_connection, "USER $irc_identd $irc_host $server_name :$irc_realname\n\r");

    fputs($irc_connection, "NICK $irc_current_nick\n\r");

    if ($irc_connection)
      $irc_connected = 1;
  }

  function irc_disconnect($reason)
  {
    global $irc_connection, $irc_connected;

    if ($irc_connected)
    {
      fputs($irc_connection, "QUIT $reason\n\r");
      fclose($irc_connection);
    }
  }
 
  function irc_put_message($message)
  {
    global $irc_connection, $irc_connected;

    if ($irc_connected)
      fputs($irc_connection, "$message\n\r");
  }

  function irc_join_channel($channel)
  {
    global $irc_connection, $irc_connected, $irc_current_channel;

    if ($irc_connected && !$irc_current_channel)
    {
      fputs($irc_connection, "JOIN $channel\n\r");
      $irc_current_channel = $channel;
    }
  }

  function irc_part_channel($channel)
  {
    global $irc_connection, $irc_connected, $irc_current_channel;

    if($irc_connected)
    {
      fputs($irc_connection, "PART $channel\n\r");
      $irc_current_channel = NULL;
    }
  }
      
  function irc_privmsg($channel, $message)
  {
    global $irc_connection, $irc_connected;

    if ($irc_connected)
      fputs($irc_connection, "PRIVMSG $channel :$message\n\r");
  }

  irc_connect($server_name, $port_nr);
  irc_join_channel("#ziso");
  irc_disconnect("Just testing...");
?>
</body>
</html>


Weet iemand trouwens hoe ik kan testen tot waar het goed gaat?

Ideas?

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Nu wordt hij helemaal leuk, hij doet het soms!

Als ik van een adere pagina kom en dan naar die van mij ga en ctrl-F5 druk, dan doet hij het, maar ik heb dit er wel in staan.

PHP:
1
2
3
4
5
6
<?
  header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
  header ("Cache-Control: no-cache, must-revalidate");
  header ("Pragma: no-cache");
?>

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 23-06 23:17
Afbeeldingslocatie: http://images.tweakers.net/forum/templates/got/images/icons/edit.gif :?
Errors afvangen ofzo? Mogelijk disconnect de irc server je.
Dat gedoe met die globals is ook ranzig, misschien is het een idee om er een class van te maken.

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ericston schreef op 13 november 2002 @ 19:24:
[afbeelding] :?
Errors afvangen ofzo? Mogelijk disconnect de irc server je.
Dat gedoe met die globals is ook ranzig, misschien is het een idee om er een class van te maken.
Hmm, dan zou hij toch gewoon een fout moeten geven zoals helemaal bovenaan staat.

En eh, dit is nog maar een test het is idd de bedoeling dat alles netjes in een class komt.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Ooit van debuggen gehoord? Heb je error_reporting op E_ALL staan?

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Soultaker schreef op 13 November 2002 @ 19:30:
Ooit van debuggen gehoord? Heb je error_reporting op E_ALL staan?
Geeeeen id... :?

Maar volgens mij heeft het gewoon met cache temaken.

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 23-06 23:17
Volgens mij moet het trouwens \r\n zijn.

Dat zou sense maken aangezien dan je constant ongetermineerde commando's stuurt naar de server waardoor er niks uitgevoerd wordt en je je bot niet ziet joinen maar waardoor er ook geen errors in het script worden gegenereerd.

Het kan geen kwaad om op verschillende plaatsen in je script - met name bij de if's waar je de connectie checkt - even de status/laatste functieaanroep/__LINE__ te echo'en. Dat helpt bij debuggen enzo...

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ericston schreef op 13 November 2002 @ 19:36:
Volgens mij moet het trouwens \r\n zijn.
Volgens mij niet.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Als het met caching te maken heeft, reload je pagina dan (of pak een fatsoenlijke browser waarvan je weet dat 'ie niet ongewenst cached; lynx, links, wget of fetch doen dit allemaal uitstekend; in de meeste browsers kun je met ctrl, shift of alt in combinatie met F5 of de reload button ook een echte reload forceren).

Wat betreft de discussie over linefeeds, de telnet protocol specificatie (RFC 854) zegt daar het volgende over:
The sequence "CR LF", as defined, will cause the NVT to be positioned at the left margin of the next print line (as would, for example, the sequence "LF CR"). However, many systems and terminals do not treat CR and LF independently, and will have to go to some effort to simulate their effect. (For example, some terminals do not have a CR independent of the LF, but on such terminals it may be possible to simulate a CR by backspacing.) Therefore, the sequence "CR LF" must be treated as a single "new line" character and used whenever their combined action is intended; the sequence "CR NUL" must be used where a carriage return alone is actually desired; and the CR character must be avoided in other contexts. This rule gives assurance to systems which must decide whether to perform a "new line" function or a multiple-backspace that the TELNET stream contains a character following a CR that will allow a rational decision.
"\r" is CR, "\n" is LF. Een CR karakter MOET gevolgd worden door een LF (om een new line aan te geven) of een NUL karakter ("\0", om aan te geven dat geen new line bedoelt is). Je moet dus inderdaad, zoals Ericston schreef, "\r\n" gebruiken, en niet "\n\r" (in welk geval het CR karakter op het eind hoogstwaarschijnlijk niet gevolgd wordt door LF of NUL, in ieder geval niet zoals je bedoeld had).

edit:
Ik zie nu dat ik er onterecht van uit ging dat IRC gebaseerd was op het Telnet protocol. Dit blijkt niet het geval te zijn! Mijn redenatie was dus niet correct. Echter, de IRC specificatie stelt: "IRC messages are always lines of characters terminated with a CR-LF (Carriage Return - Line Feed) pair", dus de conclusie gaat toch op: je moet afsluiten met "\r\n".

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ik kan met StatServ zien dat hij wel verbinding krijgt, maar daarna krijgt hij direct "Connection reset by peer".

Hoe kan het dan dat hij het soms wel doet?

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 23-06 23:17
Lees de rfc dan nog maar een keer.
IRC messages are always lines of characters terminated with a CR-LF (Carriage Return - Line Feed) pair, and these messages SHALL NOT exceed 512 characters in length, counting all characters including the trailing CR-LF. Thus, there are 510 characters maximum allowed for the command and its parameters.
http://www.irchelp.org/irchelp/rfc/rfc2812.txt

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Al geprobeerd met een andere IRC server? Kom op, een beetje pro-actief debuggen, alsjeblieft. Zelf nadenken over wat er fout kan gaan en hoe je er achter kan komen of dat het geval is, kan geen kwaad.

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Soultaker schreef op 13 november 2002 @ 19:50:
Al geprobeerd met een andere IRC server? Kom op, een beetje pro-actief debuggen, alsjeblieft. Zelf nadenken over wat er fout kan gaan en hoe je er achter kan komen of dat het geval is, kan geen kwaad.
Op een andere server precies hetzelfde...
Dus wel \n\r

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 23-06 23:17
Hehe, nou als jij dat zegt jongen...

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Soultaker schreef op 13 November 2002 @ 19:46:
Als het met caching te maken heeft, reload je pagina dan (of pak een fatsoenlijke browser waarvan je weet dat 'ie niet ongewenst cached; lynx, links, wget of fetch doen dit allemaal uitstekend; in de meeste browsers kun je met ctrl, shift of alt in combinatie met F5 of de reload button ook een echte reload forceren).

Wat betreft de discussie over linefeeds, de telnet protocol specificatie (RFC 854) zegt daar het volgende over:

[...]

"\r" is CR, "\n" is LF. Een CR karakter MOET gevolgd worden door een LF (om een new line aan te geven) of een NUL karakter ("\0", om aan te geven dat geen new line bedoelt is). Je moet dus inderdaad, zoals Ericston schreef, "\r\n" gebruiken, en niet "\n\r" (in welk geval het CR karakter op het eind hoogstwaarschijnlijk niet gevolgd wordt door LF of NUL, in ieder geval niet zoals je bedoeld had).

edit:
Ik zie nu dat ik er onterecht van uit ging dat IRC gebaseerd was op het Telnet protocol. Dit blijkt niet het geval te zijn! Mijn redenatie was dus niet correct. Echter, de IRC specificatie stelt: "IRC messages are always lines of characters terminated with a CR-LF (Carriage Return - Line Feed) pair", dus de conclusie gaat toch op: je moet afsluiten met "\r\n".
Hmm, raar...

Ik heb een irc layer gedownload van dezelfde makers als phpMyAdmin. Deze gebruiken allemaal \n\r en het werkt nog prima ook! Maar goed, ik zal het wel doen zoals het hoort. Ik heb het al geprobeert, maar het maakt verder niet uit. Precies hetzelfde probleem.

Ik heb verder bij alle ifs al gekeken of hij de goed weg gaat en dat gaat hij idd. Maar hoe kan ik kijken of hij een puts ook echt uitvoert?

En jullie hebben zeker ook geen id hoe hij zomaar een Reset by peer kan krijgen...

[ Voor 0% gewijzigd door Fles op 13-11-2002 20:16 . Reden: /n/r -> \n\r ]


Acties:
  • 0 Henk 'm!

  • ironx
  • Registratie: Augustus 2001
  • Laatst online: 01-07 19:42
En jullie hebben zeker ook geen id hoe hij zomaar een Reset by peer kan krijgen...
Je moet in de gaten houden of de server een PING? event geeft, daar moet je dan op reageren met PONG!


This posting is provided "AS IS" with no warranties, and confers no rights.


Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Oh ja! Is waar ook en het is natuurlijk soms dat ik die PING net voor ben met wat zeggen. Dan moet ik uitvoegelen wanneer ik een PING krijg in PHP.

Maar eh, het script duurt niet meer dan 1 seconde om te runnen kan het zijn dat de connectie dan al verbroken wordt? Dan moet je wel heel snel rageren op die PING

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Een normale server pingt niet ZO snel; alleen als je een tijdje (meer dan zoveel seconden; denk aan een halve minuut ofzo) inactief bent. Als je zelf vaak genoeg commando's stuurt, krijg je ook nooit een ping request. Het lijkt me sterk dat dat het is, dus.

Heb je trouwens al geprobeerd een vertraging in te bouwen, voordat je de verbinding verbreekt? Als je je socket closed, krijg je in IRC "connection reset by peer". Officieel mag je client side niet de connectie verbreken (IIRC, check de RFC om 't zeker te weten), maar moet je een QUIT commando versturen. De server sluit dan de verbinding voor je (maar daar moet je dan wel op wachten).

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
The PING command is used to test the presence of an active client or
server at the other end of the connection.Servers send a PING
message at regular intervals if no other activity detected coming
from a connection.If a connection fails to respond to a PING
message within a set amount of time, that connection is closed.A
PING message MAY be sent even if the connection is active.
Ik stuur eerst een QUIT en dan sluit ik de verbinding. Dit doe ik wel direct achter elkaar, dus ik weet niet of hij QUIT wel helemaal kan uitvoeren. Als hij het goed doet krijg ik geen Reset by peer anders wel.

Maar misschien moet ik iid een vertraging inbouwen voor de quit...
FF kijken hoe ik dat doe.

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
De pauze dat was het hem... Hij doet het iedere keer :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat \n\r werkt is omdat de meeste implementaties de \r gewoon negeren en alleen naar de \n kijken. Dit is echter niet volgens de standaard en het zal goed kunnen dat je een keer een server tegen komt die het niet accepteert. Gebruik dus gewoon \r\n zoals het hoort :)

.edit: oh je zei al dat je dat ging doen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1