Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Perl socketti ongelma

Sahrah [06.09.2008 15:09:59]

#

Miksi mää en voi lähettää dataa send():illä toisella säikeellä samaa aikaa kun odottelen revc():illä tulevaa dataa. send() vain yksinkertaisesti jää jumiin.

C:llä tuo menetelmä toimii hyvin.

Missä vika, auttakaa!! :)

_Pete_ [08.09.2008 08:58:35]

#

Ei nyt muuta tule mieleen kun:

Oletko aivan varma että recv() ja send() tehdään oikeasti eri
threadeissa? Jos ei niin silloin tuo jää taatusti jumiin. Parhaiten
voi arvailla vikaa kun näkee lähdeköödin.

Sahrah [08.09.2008 15:11:10]

#

Kyllä nuo eri säikeinä pitäisi olla.

Kun kirjotan tuohon jotain, menee se ensimäisellä kerralla perille. Sen jälkeen ei send() toimi vasta kun recv() on saannut jotain dataa, jolloin send()illä voi taas kerran lähettää jne jne...

EDIT: Minulla on windows perl, linuxissa tuo ei edes toimi, täytyypä tutkia asiaa

use strict;
use warnings;
use Socket;
use threads;

sub kirjoitusaie() {
	my $teksti = "";
	while (1) {
		$teksti = <>;
		send(SOCKET, $teksti, 0);
	}
}

my $host = 'irc.quakenet.org';
my $port = 6667;
my $proto = getprotobyname('tcp');

my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);

socket(SOCKET, PF_INET, SOCK_STREAM, $proto);
connect(SOCKET, $paddr) or die "connect $!";
sleep(2);

print "Vastaanotto silmukka alkaaa\n\n";
print "Lahetetty ident\n\n";

send(SOCKET, "NICK sadavittu\n", 0);
send(SOCKET, "USER sadavittu \"\" \"irc.quakenet.org\" :dfdsfsdf\n", 0);

my $thr1 = threads->create('kirjoitusaie');

my $rivi = "";

while (recv(SOCKET, $rivi, 128, 0)) {
	if ($rivi =~ m/PING :(.{0,})/) {
		send(SOCKET, "PONG :$1", 0);
		print "PONG :$1\n\n";
	}
	print $rivi;
}

close SOCKET;

_Pete_ [08.09.2008 20:37:47]

#

Hmm en osaa perliä ja sen syntaxia mutta voiko johtua siitä että et lähetä rivejä oikein, specsin mukaan irc-serverille lähetetyt rivit pitää päättyä:

http://www.isi.edu/in-notes/rfc2813.txt

3.3 Messages kohdan mukaan

"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."

Tuo rfc2813 ei taida olla ihan tuorein versio mutta ainakin ircnetissä vieläkin
ihan pätevä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta