[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.
User since
2004-07-19
7
Artikel
BenutzerIn
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() */
User since
2004-07-19
7
Artikel
BenutzerIn
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...
User since
2003-08-08
2561
Artikel
HausmeisterIn
@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]
User since
2004-07-19
7
Artikel
BenutzerIn
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.
User since
2003-08-04
14371
Artikel
ModeratorIn
mach aus len() mal length()...
User since
2003-08-04
7321
Artikel
ModeratorIn
hi.
okay. versuchs mal so
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-->
mach mal aus
print "Eingabe: "\n";
print "Eingabe: \n";
User since
2003-08-04
7321
Artikel
ModeratorIn
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?
User since
2003-08-04
7321
Artikel
ModeratorIn
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?