[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2004
    Beiträge
    42

    Question HTTP Request senden

    Hallo *ALL,

    ich habe folgende Aufgabe: Absetzen eines HTTP Requests von der iSeries und Empfangen der Antwort. Sollte eigentlich eine leichte Aufgabe sein. (Eine Art Webservice light)

    Mit Java funktioniert das ohne weitere Probleme (eingebunden per JNI in ILE PRG), jedoch ist die Laufzeit inakzeptabel.

    Da habe ich mich nach einer anderen Lösung umgeschaut und bin auf zwei Lösungsansätze gekommen:
    - Die HTTPAPI von Scott Klement
    - Einen HTTPClient in C
    - SRVPGM iSockets von Bob Cozzi
    Alle drei Lösungen benutzen auf der iSeries die gleichen C Funktionen um ein Socket aufzubauen und den Request zu senden.

    Der C-Client ist auf einem Windows PC lauffähig (erfolgreich getestet), auf der iSeries bekomme ich jedoch bei allen drei Lösungen jeweils keine Antwort vom Webserver, bis die Connections auf einen Timeout laufen. Lt. Netstat werden die Bytes gesendet, aber keine Empfangen. Im Aufrufstapel ist ersichtlich, dass das Programm dann jeweils auf recv steht.

    Sind evtl. TCPIP Einstellungen auf unserer iSeries falsch? Hat dort schon jemand ähnliche Erfahrungen gemacht, oder hat sogar vielleicht eine einfache andere Lösung?

    Hier ist z.B. der C-Source:
    PHP-Code:
    #include <stdio.h>
    #include <errno.h>

    #ifdef _WIN32
    /* Headerfiles für Windows */
    #include <winsock.h>
    #include <io.h>
    #else
    /* Headerfiles für Unix/Linux */
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #define closesocket(s) close(s)
    #endif

    /* Definitionen */
    #define HTTP_PORT 80
    #define HOST "99.33.137.29"
    #define URL "/ERPDocumentMaster.do?part=K.04753.370.00.00"

    /*==============*/
    /*     MAIN     */
    /*==============*/
    int mainint argcchar **argv){
        
    struct sockaddr_in server;
        
    struct hostent *host_info;
        
    unsigned long addr;
        
    int sock;
        
    char buffer[1024];
        
    int countbytes_sent;

    /* Anpassung für Windows */
    #ifdef _WIN32
        
    short wVersionRequested;
        
    WSADATA wsaData;
        
    wVersionRequested MAKEWORD (11);
        if (
    WSAStartup (wVersionRequested, &wsaData) != 0) {
            
    fprintfstderr"Failed to init windows sockets\n");
            exit(
    1);
        }
    #endif

        /* Socket erstellen */
        
    sock socketAF_INETSOCK_STREAMIPPROTO_TCP);
        if (
    sock 0) {
            
    perror"failed to create socket");
            exit(
    1);
        }


        
    /* Server Verbindung definieren (Typ, IP Adresse und Portnummer) */
        
    memset( &server0sizeof (server));

        
    server.sin_family AF_INET;
        
    server.sin_port htons (HTTP_PORT);
        
    server.sin_addr.s_addr inet_addr (HOST);

        
    /* Hostnamen auflösen */
        
    if (server.sin_addr.s_addr == INADDR_NONE) {

            
    host_info gethostbyname (HOST);
            if (
    host_info == NULL) {
                
    fprintfstderr"unknown server: %s\n"HOST);
                exit(
    1);
            }
            
    memcpy((char*) &server.sin_addr.s_addr,
                   
    host_info->h_addr,
                   
    host_info->h_length);
        }

        
    /* Zum Server verbinden */
        
    if ( connectsock, (struct sockaddr*)&serversizeofserver)) < 0) {
            
    perror"can't connect to server");
            exit(
    1);
        }

        
    /* HTTP Request senden */
        
    sprintfbuffer,"GET %s HTTP/1.0\r\n\r\n",URL);
        
    fprintf(stderrbuffer);
        
    bytes_sent sendsockbufferstrlenbuffer), 0);
        
    fprintf(stderr"Bytes gesendet: %i"bytes_sent);

        
    /* Antwort des Servers ausgeben */
        
    if (bytes_sent 0) {
            while ((
    count recv (sockbuffersizeof(buffer), 0)) > 0) {
                
    write1buffercount);
            }
        }

        
    /* Socket schließen */
        
    closesocketsock);
        return 
    count;


  2. #2
    Registriert seit
    Oct 2003
    Beiträge
    192
    Eventuell laufen schon andere Programme über die entsprechenden Ports ?

    Sind die Ports bei dem PC Server entsprechend eingestellt ?

    Hängt eine Firewall zwischen der Iseries und dem PC Server ?

    (Das waren die 3 Hindernisse meines Client-Server Gerumpels)

    Gruß
    Rince

    P.s. Habe den von Scott Klement im Einsatz

  3. #3
    Registriert seit
    Dec 2004
    Beiträge
    42
    Danke für die schnelle Antwort, habs mal geprüft:
    Der Port auf dem Server ist korrekt (Port 80 - unser standard webserver) und ist auch normal ansprechbar (Browser), eine Firewall ist nicht dazwischen, Client sowohl Server befinden sich im gleichen Subnetz. Port-Einschränkungen sind auf der iSeries nicht vorhanden. Die Ports werden aufgemacht, eine Verbindung wird korrekt hergestellt.

    Am Server scheints übrigens nicht zu liegen, ich habs mit dem Apache auf unserer iSeries, sowie mit einem Tomcat auf einem PC-Server probiert, beides mal das gleiche Problem des "hängenbleibens".

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    am Server kanns nicht liegen, wenn dein Java Programm gefunzt hat...
    ich würde mir das Gedöns mit den Sockets nicht antun, sondern das zugrunde liegende Java Problem heilen!
    Das Problem ist der synchrone JNI Call, da der erst mal eine JVM startet und das dauert und frisst zudem endlos Ressourcen, wenn das in jedem Job passiert (deshalb geht das auch relativ einfach aus RPG - Nachtigall ick hör die trapsen), lediglich die as400 hat dann die Vogelgrippe.
    Am einfachsten machst du aus deinem Java Programm einen kleinen Serverdienst, der einmal gestartet wird und dann an einer DTAQ wartet, für jeden Job eine AntwortQ erstellt und dort seine Antworten sendet. Ansonsten alles wie gehabt. Für das RPG Programm machst du dann ein kleines Serviceprogramm, das die Aufrufe aus deinen Anwendungen vereinfacht.

    mfg

    Dieter Bender


    Zitat Zitat von NEich
    Danke für die schnelle Antwort, habs mal geprüft:
    Der Port auf dem Server ist korrekt (Port 80 - unser standard webserver) und ist auch normal ansprechbar (Browser), eine Firewall ist nicht dazwischen, Client sowohl Server befinden sich im gleichen Subnetz. Port-Einschränkungen sind auf der iSeries nicht vorhanden. Die Ports werden aufgemacht, eine Verbindung wird korrekt hergestellt.

    Am Server scheints übrigens nicht zu liegen, ich habs mit dem Apache auf unserer iSeries, sowie mit einem Tomcat auf einem PC-Server probiert, beides mal das gleiche Problem des "hängenbleibens".
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Dec 2004
    Beiträge
    42
    Danke für die Antworten,
    mit einem Dauerjob läufts nun erträglicherweise (Entweder ich bin nicht für den produktiven Einsatz geeignet oder Java)

    Warum aber die Sockets auf unserem System Schwierigkeiten machen (bei anderen scheints ja zu funktionieren) ist mir immer noch schleierhaft.

Similar Threads

  1. XML zu einem Port Senden
    By Weki in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 11-09-06, 13:31
  2. Senden via PDFWTR an QNTC
    By fischers in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 12-06-06, 08:57
  3. HTTP server *Admin won't start
    By troepen in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 10-05-06, 21:59
  4. Http Admin Server Startet nicht mehr
    By Techniker in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 26-04-06, 15:20
  5. emails von as400 direkt senden?
    By Koelch400 in forum IBM i Hauptforum
    Antworten: 17
    Letzter Beitrag: 16-01-05, 10:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •