You don't mention what server you're using to test RedHat. Perhaps the problem with FreeBSD is related to how locus.apache.org is configured? I would imagine that TCP/IP port security is pretty tight on the Apache server.
Dave "Rahul Jain" <[EMAIL PROTECTED] To: <[EMAIL PROTECTED]> e.org> cc: (bcc: David N Bertoni/CAM/Lotus) Subject: 'connection refused' only on RH Linux/FreeBSD. Works 03/14/2000 under AIX/Solaris/HPUX... 09:38 PM Please respond to xerces-dev 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 <-----------------------------------------------------------------------------