PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // openSocket.cc 00004 // 00005 // Copyright (C) 2004 Christian Hudon 00006 // 00007 // Redistribution and use in source and binary forms, with or without 00008 // modification, are permitted provided that the following conditions are met: 00009 // 00010 // 1. Redistributions of source code must retain the above copyright 00011 // notice, this list of conditions and the following disclaimer. 00012 // 00013 // 2. Redistributions in binary form must reproduce the above copyright 00014 // notice, this list of conditions and the following disclaimer in the 00015 // documentation and/or other materials provided with the distribution. 00016 // 00017 // 3. The name of the authors may not be used to endorse or promote 00018 // products derived from this software without specific prior written 00019 // permission. 00020 // 00021 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00022 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00023 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00024 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00025 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00026 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 // 00032 // This file is part of the PLearn library. For more information on the PLearn 00033 // library, go to the PLearn Web site at www.plearn.org 00034 00035 /* ******************************************************* 00036 * $Id: openSocket.cc 6676 2007-02-22 21:05:50Z saintmlx $ 00037 ******************************************************* */ 00038 00039 // Authors: Christian Hudon 00040 00043 #include <string> 00044 #include <plearn/base/PrUtils.h> 00045 #include <plearn/io/PStream.h> 00046 #include <plearn/io/PrPStreamBuf.h> 00047 #include "openSocket.h" 00048 #include <nspr/prio.h> 00049 #include <nspr/prerror.h> 00050 #include <nspr/prnetdb.h> 00051 00052 #define PL_LOG_MODULE_NAME "openSocket" 00053 #include <plearn/io/pl_log.h> 00054 00055 namespace PLearn { 00056 using namespace std; 00057 00072 PStream openSocket(const string& hostname, int port, 00073 PStream::mode_t io_formatting, 00074 const int timeout) 00075 { 00076 PStream st; 00077 st.setMode(io_formatting); 00078 00079 PRFileDesc* socket = PR_NewTCPSocket(); 00080 00081 if (!socket) 00082 PLERROR("openSocket: socket creation failed! (Maybe you ran out of file descriptors?)"); 00083 00084 // Look up the host name. 00085 PRHostEnt host; 00086 char buf[PR_NETDB_BUF_SIZE]; 00087 if (PR_GetHostByName(hostname.c_str(), buf, sizeof(buf), &host) != PR_SUCCESS) 00088 PLERROR("openSocket(%s, %d) failed during host name lookup: %s", 00089 hostname.c_str(), port, getPrErrorString().c_str()); 00090 00091 // Iterate on every address for the host, until we can connect to one. 00092 int host_entry_index = 0; 00093 PRNetAddr address; 00094 while ((host_entry_index = PR_EnumerateHostEnt(host_entry_index, &host, 00095 port, &address)) != 0) 00096 { 00097 if (PR_Connect(socket, &address, PR_SecondsToInterval(timeout)) 00098 == PR_SUCCESS) 00099 { 00100 return new PrPStreamBuf(socket, socket, true, true); 00101 } 00102 else 00103 { 00104 #ifdef BOUNDCHECK 00105 string ip_adr = "Unknown IP address"; 00106 if (PR_NetAddrToString(&address, buf, sizeof(buf)) == PR_SUCCESS) 00107 ip_adr = buf; 00108 MODULE_LOG << "Error trying to connect to host entry index " 00109 << host_entry_index << " (" << ip_adr << "): " 00110 << getPrErrorString() << endl; 00111 #endif 00112 } 00113 } 00114 00115 PLERROR("openSocket(%s, %d) failed while trying to connect: %s", 00116 hostname.c_str(), port, getPrErrorString().c_str()); 00117 return st; 00118 } 00119 00120 } // end of namespace PLearn 00121 00122 00123 /* 00124 Local Variables: 00125 mode:c++ 00126 c-basic-offset:4 00127 c-file-style:"stroustrup" 00128 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00129 indent-tabs-mode:nil 00130 fill-column:79 00131 End: 00132 */ 00133 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :