Schrift
[thread]4291[/thread]

Socket Connect mit Perl: Socket Connect mit Perl (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
Gast Gast
 2004-07-19 19:48
#37383 #37383
[E|B
,19.07.2004, 17:46]Ja, er sagte er möchte eine Socket API. Nix LWP also...

Dann nehme ich alles zurück und schließe mich allen Vorrednern an.
blackheim
 2004-07-20 09:42
#37384 #37384
User since
2004-07-19
7 Artikel
BenutzerIn
[default_avatar]
hallo nochmal.

also zur zeit habe ich etwas ähnliches in C gemacht. (hab aber egientlich keine ahnung von C :-( .
deshalb würde ich sowas gern in perl basteln.
nochmal kurz zum problem:

- ich habe von einer externen Firma eine asynchrone Socket-API zur Verfügung gestellt bekommen (IP+Port) (incl. der möglichen Reuqests..)
- nun will ich ein kleines Tool bauen, welches sich auf den Socket verbindet und Requests absendet und den Response dieses "Socket-APi-Servers" ausgibt bis ich irgendwann das Programm mit einem bestimmten String beende. (QUIT oder so..)

ich kann ja mal meinen C-Code posten :-)

########################################

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SERVER_PORT 40411

/* Fehlerausgang */
void error_exit(char *name, char *call)
{
char buf[256];

sprintf(buf, "\7\7\nCLIENT ERROR! %s in %s: ", name, call);
perror(buf);
exit(1);

} /* error_exit() */

void main(int argc, char **argv)
{
int sock_fd;
struct sockaddr_in server_addr;
char buffer[256];
int nbytes, rval;

/* 1. Parameter = IP-Adresse des Servers */
if (argc != 2) {
fprintf(stderr, "Aufruf: %s Server-IP-Adresse\n", argv[0]);
exit(1);
}

/* Socket oeffnen */
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
fprintf(stderr, "CLIENT SOCKET %d\n", sock_fd);
if (sock_fd < 0)
error_exit(argv[0], "socket");

/* Socket mit Server verbinden */
bzero((char *) &server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(SERVER_PORT);
rval = connect(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr));
fprintf(stderr, "CLIENT CONNECT %d\n", rval);
if (rval < 0)
error_exit(argv[0], "connect");

/* Eine Zeile lesen, versenden, Echo lesen und ausgeben */
fprintf(stderr, "Eingabe: ");
if (fgets(buffer, sizeof(buffer) - 1, stdin)) {
nbytes = strlen(buffer);
if (nbytes > 0 && buffer[nbytes-1] == '\n')
buffer[nbytes-1] = '\0';
nbytes = write(sock_fd, buffer, sizeof(buffer));
if (nbytes < 0)
error_exit(argv[0], "write");
fprintf(stderr, "CLIENT WRITE %d Bytes [%s]\n", nbytes, buffer);
nbytes = read(sock_fd, buffer, sizeof(buffer));
if (nbytes < 0)
error_exit(argv[0], "read");
fprintf(stderr, "CLIENT READ %d Bytes [%s]\n", nbytes, buffer);

/* Eine Zeile lesen, versenden, Echo lesen und ausgeben */
fprintf(stderr, "Eingabe: ");
if (fgets(buffer, sizeof(buffer) - 1, stdin)) {
nbytes = strlen(buffer);
if (nbytes > 0 && buffer[nbytes-1] == '\n')
buffer[nbytes-1] = '\0';
nbytes = write(sock_fd, buffer, sizeof(buffer));
if (nbytes < 0)
error_exit(argv[0], "write");
fprintf(stderr, "CLIENT WRITE %d Bytes [%s]\n", nbytes, buffer);
nbytes = read(sock_fd, buffer, sizeof(buffer));
if (nbytes < 0)
error_exit(argv[0], "read");
fprintf(stderr, "CLIENT READ %d Bytes [%s]\n", nbytes, buffer);


}
close(sock_fd);

exit(0);

} /* main() */
blackheim
 2004-07-20 13:06
#37385 #37385
User since
2004-07-19
7 Artikel
BenutzerIn
[default_avatar]
hallo :-)

nee - ich will nur den client basteln.
der server wird mir von einer externen firma zur verfügung gestellt.
ich habe von denen nur IP-Port + Syntax fuer Requests erhalten.
deshalb will ich einen client der sich auf diesen vorhandenen Server verbindet und Requests absendet und das was zurückkommt ausgibt - solange , bis ich das programm beende...
[E|B]
 2004-07-20 13:27
#37386 #37386
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@esskar

Deine while()-Schleife hat eine Klammer zu viel.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
blackheim
 2004-07-20 13:40
#37387 #37387
User since
2004-07-19
7 Artikel
BenutzerIn
[default_avatar]
hi.

damit krieg ich den socket-connect hin - aber danach:

C:\Ablage>uwe.pl
KARAMBA
Eingabe:
CI|REV=1.5|NAME=USER|PASSWORD=PASS
Undefined subroutine &main::len called at C:\Ablage\uwe.pl line 24, <STDIN> line
1.
renee
 2004-07-20 13:47
#37388 #37388
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
mach aus len() mal length()...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2004-07-20 17:15
#37389 #37389
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi.

okay. versuchs mal so

Code: (dl )
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
use strict;
use IO::Socket;
use IO::Socket::INET;

my $CRLF = chr(13).chr(10);

use constant SERVER_PORT => 40411;
use constant KEEPALIVESEC => 10;


my $sock = IO::Socket::INET->new(PeerHost => 'localhost', PeerPort => SERVER_PORT, Proto => 'tcp');

if($sock->connected)
{
 print "KARAMBA\n";

 local $SIG{ALRM} = sub {
    if($sock->connected)
    {
       $sock->write("E$CRLF", 3);
$sock->getline();
       alarm KEEPALIVESEC;
    }
 }
 alarm KEEPALIVESEC;

 my $request = "";
 my $response = "";
 while(lc($request) ne "quit" and lc($response) ne "quit")
 {      
    print "Eingabe: \n";
    $request = <STDIN>;
   
    alarm KEEPALIVESEC; # alarm reset (hoffentlich; kenn ich damit gar nicht aus)

    chomp $request;

    $sock->write("$request$CRLF", length($request)+2);
    print "YOU wrote: [$request]\n";
    $response = $sock->getline();
    chomp $response;
    $response =~ s!$CRLF$!!g; # to be sure
    print "SERVER wrote: [$response]\n";
 }
 alarm 0;               # race condition protection
}


spaß\n\n

<!--EDIT|esskar|1090329368-->
Gast Gast
 2004-07-20 14:02
#37390 #37390
mach mal aus
     
    print "Eingabe: "\n";      
    print "Eingabe: \n";
esskar
 2004-07-20 16:06
#37391 #37391
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay...
schliesse die augen und stell dir den augenblick vor, an dem der client perfekt mit dem server kommuniziert...
*aufwachen* und jetzt erzähl mir, was genau dein client mit dem server austauschen soll...
* braucht dein client usereingaben
* oder schickt er daten aus einem container (file, db, etcpp) an den server
* oder wie oder was?
esskar
 2004-07-20 16:47
#37392 #37392
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay...
und du willst eben noch was dazu haben, dass dir - wenn der user mal vergisst was einzutippen - die verbindung am leben hält; dies machst du dann, in dem der client; automatisch ein E schickt?

welches betriebssystem benutzt du?
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2004-07-19 17:34.