Finalbrainxp
12-11-2004, 17:48
Hi Leute, bin ganz neu bei Linux und habe gerade meine erstes RPC-Programm fertig. (Suse9.1)
Es funktioniert wunderbar, auch über Rechnergrenzen hinweg. Nur habe ich da ein übles Problem.
meinen client rufe ich so auf:
./client ServerName
Wenn ich jetzt einen Server anspreche, welcher keinen RPC-Dienst zur Verfügung stellt,
dann bekomme ich einen Time-Out Fehler. Das ist auch gut so, aber ich muss so im Schnitt
70 Sekunden warten bis der Fehler kommt. Wie kann ich das Timeout heruntersetzen bzw. deaktivieren ? Habe schon in etlichen HP's geschaut, aber es scheint keine optimale Lösung dafür zu geben. Habe schon clnt_control() und clntudp_create(...,time) probiert, aber am Timeout verändert sich nichts!
Hier mein ClientCode:
#include <stdio.h>
#include <rpc/rpc.h>
#include "prime.h"
main(int argc, char **argv)
{
int i;
CLIENT *cl; /* Client Handle */
prime_result *result; /* Pointer to result Paket */
prime_request request; /* request Paket */
if (argc == 4)
{
cl = clnt_create(argv[1], (unsigned int)PRIMEPROG, (unsigned int)PRIMEVERS,"udp"); //Hier dauert es bis zu 70 Sekunden!!
if (cl == NULL) { clnt_pcreateerror(argv[1]); exit(2); };
request.min = atoi(argv[2]);
request.max = atoi(argv[3]);
result = find_primes_1(&request, cl); /* remote procedure aufrufen */
for(i=0; i< result->length; i++)
printf("%d ist Primzahl\n", result->array[i]);
xdr_free((xdrproc_t)xdr_prime_result, (char*)result); /* Freigeben des Result-Arrays */
clnt_destroy(cl);
}
else
printf("USAGE: client [SERVER] [MIN][MAX]\n");
}
Hatte auch schon folgende Alternative Probiert:
#include <stdio.h>
#include <rpc/rpc.h>
#include "prime.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
main(int argc, char **argv)
{
int i;
register CLIENT *cl; /* Client Handle */
prime_result *result; /* Pointer to result Paket */
prime_request request; /* request Paket */
if (argc == 4)
{
struct hostent *hp;
struct timeval t1;
struct sockaddr_in s_addr;
int sock = RPC_ANYSOCK;
register CLIENT *cp;
unsigned long n;
t1.tv_sec = 1;
t1.tv_usec = 0;
hp = gethostbyname (argv[1]);
bcopy (hp->h_addr, (caddr_t)&s_addr.sin_addr, hp->h_length);
s_addr.sin_family = AF_INET;
s_addr.sin_port = 0;
cl = clntudp_create(&s_addr, PRIMEPROG, PRIMEVERS, t1, &sock);
if (cl == NULL)
{
printf("test\n");
clnt_pcreateerror(argv[1]);
exit(2);
};
request.min = atoi(argv[2]);
request.max = atoi(argv[3]);
result = find_primes_1(&request, cl); /* remote procedure aufrufen */
for(i=0; i< result->length; i++)
printf("%d ist Primzahl\n", result->array[i]);
xdr_free((xdrproc_t)xdr_prime_result, (char*)result); /* Freigeben des Result-Arrays */
clnt_destroy(cl);
}
else
printf("USAGE: client [SERVER] [MIN][MAX]\n");
}
Weiss da nicht mehr weiter....
will einfach nur, das wenn ich einen Server anspreche, welcher nicht vorhanden ist, oder
kein RPC-Dienst anbietet (Keinen Portmapper), dass es direkt abgebrochen wird und
eine entsprechende Fehlermeldung ausgegeben wird *heul
Weiss jemand von Euch da ne Lösung ?
:)
Vielen Dank im vorraus
Freundlicher Gruss
Finalbrain
PS: Und wieder ein neuer Microsoft-Hasser :D
Es funktioniert wunderbar, auch über Rechnergrenzen hinweg. Nur habe ich da ein übles Problem.
meinen client rufe ich so auf:
./client ServerName
Wenn ich jetzt einen Server anspreche, welcher keinen RPC-Dienst zur Verfügung stellt,
dann bekomme ich einen Time-Out Fehler. Das ist auch gut so, aber ich muss so im Schnitt
70 Sekunden warten bis der Fehler kommt. Wie kann ich das Timeout heruntersetzen bzw. deaktivieren ? Habe schon in etlichen HP's geschaut, aber es scheint keine optimale Lösung dafür zu geben. Habe schon clnt_control() und clntudp_create(...,time) probiert, aber am Timeout verändert sich nichts!
Hier mein ClientCode:
#include <stdio.h>
#include <rpc/rpc.h>
#include "prime.h"
main(int argc, char **argv)
{
int i;
CLIENT *cl; /* Client Handle */
prime_result *result; /* Pointer to result Paket */
prime_request request; /* request Paket */
if (argc == 4)
{
cl = clnt_create(argv[1], (unsigned int)PRIMEPROG, (unsigned int)PRIMEVERS,"udp"); //Hier dauert es bis zu 70 Sekunden!!
if (cl == NULL) { clnt_pcreateerror(argv[1]); exit(2); };
request.min = atoi(argv[2]);
request.max = atoi(argv[3]);
result = find_primes_1(&request, cl); /* remote procedure aufrufen */
for(i=0; i< result->length; i++)
printf("%d ist Primzahl\n", result->array[i]);
xdr_free((xdrproc_t)xdr_prime_result, (char*)result); /* Freigeben des Result-Arrays */
clnt_destroy(cl);
}
else
printf("USAGE: client [SERVER] [MIN][MAX]\n");
}
Hatte auch schon folgende Alternative Probiert:
#include <stdio.h>
#include <rpc/rpc.h>
#include "prime.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
main(int argc, char **argv)
{
int i;
register CLIENT *cl; /* Client Handle */
prime_result *result; /* Pointer to result Paket */
prime_request request; /* request Paket */
if (argc == 4)
{
struct hostent *hp;
struct timeval t1;
struct sockaddr_in s_addr;
int sock = RPC_ANYSOCK;
register CLIENT *cp;
unsigned long n;
t1.tv_sec = 1;
t1.tv_usec = 0;
hp = gethostbyname (argv[1]);
bcopy (hp->h_addr, (caddr_t)&s_addr.sin_addr, hp->h_length);
s_addr.sin_family = AF_INET;
s_addr.sin_port = 0;
cl = clntudp_create(&s_addr, PRIMEPROG, PRIMEVERS, t1, &sock);
if (cl == NULL)
{
printf("test\n");
clnt_pcreateerror(argv[1]);
exit(2);
};
request.min = atoi(argv[2]);
request.max = atoi(argv[3]);
result = find_primes_1(&request, cl); /* remote procedure aufrufen */
for(i=0; i< result->length; i++)
printf("%d ist Primzahl\n", result->array[i]);
xdr_free((xdrproc_t)xdr_prime_result, (char*)result); /* Freigeben des Result-Arrays */
clnt_destroy(cl);
}
else
printf("USAGE: client [SERVER] [MIN][MAX]\n");
}
Weiss da nicht mehr weiter....
will einfach nur, das wenn ich einen Server anspreche, welcher nicht vorhanden ist, oder
kein RPC-Dienst anbietet (Keinen Portmapper), dass es direkt abgebrochen wird und
eine entsprechende Fehlermeldung ausgegeben wird *heul
Weiss jemand von Euch da ne Lösung ?
:)
Vielen Dank im vorraus
Freundlicher Gruss
Finalbrain
PS: Und wieder ein neuer Microsoft-Hasser :D