namous
04-05-2006, 18:53
Ich hab mir (zugegeben mit copy&past) in C einen Client fuer Windows erstellt, der Verbindung zu meinem Perl-Server aufnehmen kann/soll.
Zuerst mal der C-Code des Clients:
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
int startWinsock(void);
int main()
{
long rc;
SOCKET s;
SOCKADDR_IN addr;
rc=startWinsock();
if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
return 1;
}
else
{
printf("Winsock gestartet!\n");
}
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket erstellt!\n");
}
memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
addr.sin_family=AF_INET;
addr.sin_port=htons(12345); // wir verwenden mal port 12345
addr.sin_addr.s_addr=inet_addr("84.16.229.137"); // zielrechner ist unser eigener
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
if(rc==SOCKET_ERROR)
{
printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Verbunden.\n");
char buf[256];
strcpy(buf, "Halllooo");
send(s,buf,7,0);
}
return 0;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
Wenn ich das richtig sehe, ist die Verbindung verbindungsorientiert. Ich hab schon erfahrungen mit nicht-verbindungsorientierten Server in Perl, siehe:
use strict;
use IO::Socket;
my $sock = IO::Socket::INET->new( Listen => 5,
LocalAddr => '84.1*.***.***',
LocalPort => 12345,
Proto => 'tcp');
while(my $client = $sock->accept())
{
my $msg = <$client>;
print $msg;
}
Ich hab auch schon diverse Versuche unternommen, einen verbindungsorientierten Server hinzubekommen, hat aber leider nicht geklappt. Hier mal mein letzter Versuch:
use strict;
use IO::Socket;
socket(Server, AF_INET, SOCK_STREAM, getprotobyname('tcp')) || die("socket: $!");
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die("setsockopt: $
!");
bind(Server, sockaddr_in(12345, INADDR_ANY)) || die("bind: $!");
listen(Server, SOMAXCONN) || die("listen: $!");
for(;;)
{
accept(Client, Server);
my $msg;
recv(Server, $msg, 5, 0);
print $msg;
}
Koenntet ihr mir bitte weiterhelfen, den Perl-Server zu erstellen? Ich waere euch sehr dankbar.
MfG namous
Zuerst mal der C-Code des Clients:
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
int startWinsock(void);
int main()
{
long rc;
SOCKET s;
SOCKADDR_IN addr;
rc=startWinsock();
if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
return 1;
}
else
{
printf("Winsock gestartet!\n");
}
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket erstellt!\n");
}
memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
addr.sin_family=AF_INET;
addr.sin_port=htons(12345); // wir verwenden mal port 12345
addr.sin_addr.s_addr=inet_addr("84.16.229.137"); // zielrechner ist unser eigener
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
if(rc==SOCKET_ERROR)
{
printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Verbunden.\n");
char buf[256];
strcpy(buf, "Halllooo");
send(s,buf,7,0);
}
return 0;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
Wenn ich das richtig sehe, ist die Verbindung verbindungsorientiert. Ich hab schon erfahrungen mit nicht-verbindungsorientierten Server in Perl, siehe:
use strict;
use IO::Socket;
my $sock = IO::Socket::INET->new( Listen => 5,
LocalAddr => '84.1*.***.***',
LocalPort => 12345,
Proto => 'tcp');
while(my $client = $sock->accept())
{
my $msg = <$client>;
print $msg;
}
Ich hab auch schon diverse Versuche unternommen, einen verbindungsorientierten Server hinzubekommen, hat aber leider nicht geklappt. Hier mal mein letzter Versuch:
use strict;
use IO::Socket;
socket(Server, AF_INET, SOCK_STREAM, getprotobyname('tcp')) || die("socket: $!");
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die("setsockopt: $
!");
bind(Server, sockaddr_in(12345, INADDR_ANY)) || die("bind: $!");
listen(Server, SOMAXCONN) || die("listen: $!");
for(;;)
{
accept(Client, Server);
my $msg;
recv(Server, $msg, 5, 0);
print $msg;
}
Koenntet ihr mir bitte weiterhelfen, den Perl-Server zu erstellen? Ich waere euch sehr dankbar.
MfG namous