Gå til innhold

IRC-bot (Ikke-blokkerende sockets , (++))


Anbefalte innlegg

Jeg holder på å lage en IRC-bot, men sitter fast på ikke-blokkerende sockets. Det virker som om både fgets og fread returner false uansett. Vedlagt finner dere prosjektet, pluss en loggfil.

 

Her er bot.php og socket.php for de som er for late til å laste det ned :p (Zip-filen inneholder hele prosjektet)

 

Det hadde også vært greit om jeg kunne fått litt generell tilbakemelding på prosjektet, men husk på at det er langt fra ferdig, så mye kan/skal endres, spesielt moduler.

ircbot.zip

Lenke til kommentar
Videoannonse
Annonse
Jeg holder på å lage en IRC-bot, men sitter fast på ikke-blokkerende sockets. Det virker som om både fgets og fread returner false uansett. Vedlagt finner dere prosjektet, pluss en loggfil.

 

Her er bot.php og socket.php for de som er for late til å  laste det ned :p (Zip-filen inneholder hele prosjektet)

 

Det hadde også vært greit om jeg kunne fått litt generell tilbakemelding på prosjektet, men husk på at det er langt fra ferdig, så mye kan/skal endres, spesielt moduler.

8815680[/snapback]

Så... avansert ut =P

hehe ;) har selv laget chatboter fks. noen flash spill.

Jeg har jo aldri hatt problemer med sockets? Kanskje bare jeg som ikke har utforsket dette med sockets grundig nok.

*Sitte å skrive IRC Bot* :p

Lenke til kommentar
*snip*

8815680[/snapback]

Endelig et interessant prosjekt å titte på.

Nå må jeg innrømme at jeg ikke har lastet ned hele prosjektet ennå, men godt mulig at jeg gjør akkurat det. Med sockets som ikke blokkerer burde du bruke socket_select() med en timeout (litt avhengig av hvordan boten skal fungere. Kan forklare mer om dette om ønskelig) for å unngå at CPU-forbruket går i taket og, som du sier, read returnerer tomt hele tiden.

 

Merker at jeg nå muligens ikke svarer helt på spørsmål, men etter å ha tittet litt rundt anbefaler jeg å lese kommentarene her:

http://no2.php.net/manual/en/function.socket-read.php

 

Tror du burde brukte socket_read istedenfor read/fgets, men i PHP_BINARY_MODE og heller bruke unpack. Da kan du også sjekke for feil med socket_last_error(). Når det er sagt, _er det mulig_ du kan bruke socket_last_error med fgets og fread også, uten at jeg vet det helt sikkert.

Lenke til kommentar

Har skiftet fra fsockopen til socket_create, men få denne feilmeldingen.

socket.php

Warning: socket_read(): unable to read from socket [0]: Operasjonen er utf°rt.
in C:\Documents and Settings\BTH\workspace\IRC Bot\socket.php on line 248

 

Nazgul: Kan du utdype litt mer om socket_select, leste dokumentasjonen, men ble ikke så veldig mye klokere.

Endret av itsmebth
Lenke til kommentar

Greia med ikke-blokkerende sockets er at når du leser fra dem, så returnerer read det som er der, som i de fleste tilfeller ikke er noe som helst. Så om du har en loop:

while( true )

read_from_sock();

 

Med blokkerende sockets, så vil read_from_sock() "henge" til den får noe å returnere. Ved ikke-blokkerende, så vil read_from_sock returnere hele tiden. Da er det to ting du må huske på.

1) Godt mulig du ikke har fått hele setningen (sjekk for \n f.eks.)

2) read_from_sock kan returnere ingenting (tom streng)

 

Problemet med det siste er at når read_from_sock returnerer hele tiden, så vil loopen kjøre VELDIG mange ganger i sekundet, noe som er helt unødvendig, og her kommer socket_select inn.

 

Med socket_select så "henger" socket_select så lenge som du spesifiserer, eller til en av socketene har endret status. (såvidt jeg husker). Da er du garantert èn av to ting.

1) Det har ikke skjedd noe og tiden har løpt ut

2) En av socketene har endret status.

 

Dersom 2, så har du gjort en del forbedringer.

1) CPU-forbruket vil ligge under 1% istedenfor på 100%

2) Du vet at noe har skjedd, f.eks. at det er noe å lese eller at socketen er stengt.

 

 

Dersom du sjekker ut beej's networking guide og slår opp på select(), så vil du antakelig lære noe mer. (Denne guiden er for C, men du skjønner ihvertfall hva select gjør og brukes til)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...