I e-mailed to the xerces-dev group but I think my mail got returned.
So here I go again,

Rahul replace the following line

   sa.sin_port = pno;

With:

   sa.sin_port = htons( pno);

My explanation follows:

The reason your original source would not work in Linux or the
Free BSD is because TCP/IP mandates that big-endian byte order be
used for transmitting protocol information.
Your code works on the Solaris platform because Sun ( running
or Sparc or MC6xxxx ) is a big endian platform.

You should use the convertion methods:

htonl, htons, ntohl, ntohs, for converting between host byte order
to network byte order ( and vice).

Would you also like the Windows equivalent of your source?

Thanks,
           Jeffrey Rodriguez
           XML Development ( former Linux  hacker)
           IBM Cupertino











From: "Rahul Jain" <[EMAIL PROTECTED]>
Reply-To: "Rahul Jain" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Subject: 'connection refused' only on RH Linux/FreeBSD. Works under AIX/Solaris/HPUX...
Date: Tue, 14 Mar 2000 18:38:11 -0800


Hi,

I am stuck with this problem and would appreciate if anyone had
any suggestions / ideas / theory explaining the behviour that
I describe below.

The problem has nothing to do with XML, but I wish to add
capability to fetch HTTP URL's to Xerces-C. Hence, I am posting
on this mailing list, with the hope that someone with more
experience under Linux will be able to help me.

I wrote a simple C++ program which creates a socket, connects
to the HTTP server specified (at the given/default port), and
fetches the content of the resource specified in the URL (source
code appended below).

THE PROBLEM
-----------

This program works under Solaris 2.6 (CC), AIX (xlC),
HPUX (CC and aCC) as expected. However, when I try running
it under RH 6.0/6.1 or FreeBSD (locus.apache.org) it fails
to 'connect()' and gives a 'connection refused' error message.

I have looked at the source code for number of open source
products and I don't seem to be doing things any differently.
My attempt is very straightforward.

If anyone could please, tell me what I need to do to get this
code to work under RH 6.0/6.1, I'll be grateful.

Thanks,

rahul


Attached below: The code. Save in file getURL.cpp

To compile:            g++ -o getURL getURL.cpp
To run:                ./getURL www.apache.org
result:                should see the content of the URL scroll by
                       in the shell.

8<----------------------------------------------------------------------

#include <iostream.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>


#define BUFLENT 512


int getServerName(char* httpURL, char*& serverName, int& portNumber);


int getServerName(char* httpURL, char*& serverName, int& portNumber) { int retval = 1; int lent = 0; int lent1 = 0; char* colonPos = 0; char* slashPosn = 0; char* pnumStr = 0;

    if ((httpURL == NULL) || (*httpURL == 0x00))
    {
        return retval;
    }
    colonPos = strchr(httpURL, ':');
    if (colonPos == 0)
    {
        slashPosn = strchr(httpURL, '/');
        if (slashPosn == 0)
        {
            lent = strlen(httpURL);
            serverName = new char[lent + 1];
            strcpy(serverName, httpURL);
        }
        else
        {
            lent1 = slashPosn - httpURL;
            serverName = new char[lent1 + 1];
            strncpy(serverName, httpURL, lent1);
            serverName[lent1] = 0;
        }
        portNumber = 80;
    }
    else
    {
        int lent = colonPos - httpURL;
        serverName = new char[lent + 2];
        strncpy(serverName, httpURL, lent);
        serverName[lent] = 0;
        slashPosn = strchr(colonPos, '/');
        if (slashPosn == 0)
            portNumber = atoi(colonPos + 1);
        else
        {
            lent1 = slashPosn - colonPos - 1;
            char*  pnumStr = new char[lent1 + 1];
            strncpy(pnumStr, colonPos + 1, lent1);
            pnumStr[lent1] = 0x00;
            portNumber = atoi(pnumStr);
            delete pnumStr;
        }
    }

    retval = 0;
    return retval;
}


int main(int argc, char* argv[]) { char obuf[BUFLENT + 1]; char ibuf[BUFLENT + 1]; int lent = 0; struct sockaddr_in sa; struct hostent* hp;


if (argc < 2) { cout << "Usage: " << argv[0] << " http_URL" << endl; exit(-1); } char* url = argv[1]; char* server = NULL; int pno = 0; int retval = getServerName(url, server, pno); if (retval != 0) { cout << "Error extracting hostname from URL: " << url << endl; exit(-1); }

    cout << "Server name: " << server << endl;
    cout << "Port Number: " << pno << endl;

    if ((hp = gethostbyname(server)) == NULL)
    {
        cout << "Could not determine the hostaddress." << endl;
        exit(-1);
    }

    bcopy((char *) hp->h_addr, (char *) &sa.sin_addr, hp->h_length);
    sa.sin_family = hp->h_addrtype;
    sa.sin_port = pno;

    int  s = 0;
    s = socket(hp->h_addrtype, SOCK_STREAM, 0);
    if (s < 0)
    {
        cout << "Could not create a socket." << endl;
        exit(-1);
    }

if (connect(s, (struct sockaddr *) &sa, sizeof(sa)) < 0)
{
cout <<
"Could not connect the socket to the destination address/port."
<< endl;
perror("");
exit(-1);
}


    // Now you can simply read and write from/to the socket.

    sprintf(obuf, "GET http://%s\n\n";, url);
    if (write(s, (void *) obuf, strlen(obuf)) != strlen(obuf))
    {
        cout << "Could not write the request to the socket." << endl;
        exit(-1);
    }

    while ((lent = read(s, ibuf, BUFLENT)) > 0)
    {
        write(1, ibuf, lent);
    }

    close(s);
    delete server;
}

8<-----------------------------------------------------------------------------



______________________________________________________ Get Your Private, Free Email at http://www.hotmail.com



Reply via email to