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;