34 #include <sys/types.h> 35 #include <sys/socket.h> 36 #include <netinet/in.h> 37 #include <arpa/inet.h> 40 #include <netinet/tcp.h> 58 using std::istringstream ;
72 string err(
"Socket is already listening" ) ;
78 string err(
"Socket is already connected" ) ;
85 struct protoent *pProtoEnt ;
86 struct sockaddr_in sin ;
89 if( isdigit( _host[0] ) )
91 if( ( address = inet_addr( _host.c_str() ) ) == -1 )
93 string err(
"Invalid host ip address " ) ;
97 sin.sin_addr.s_addr = address ;
98 sin.sin_family = AF_INET ;
102 if( ( ph = gethostbyname( _host.c_str() ) ) == NULL )
108 string err(
"No such host " ) ;
114 string err(
"Host " ) ;
115 err += _host +
" is busy, try again later" ;
120 string err(
"DNS error for host " ) ;
126 string err(
"No IP address for host " ) ;
138 sin.sin_family = ph->h_addrtype ;
139 for(
char **p =ph->h_addr_list; *p != NULL; p++ )
142 (void)memcpy( &in.s_addr, *p,
sizeof( in.s_addr ) ) ;
143 memcpy( (
char*)&sin.sin_addr, (
char*)&in,
sizeof( in ) ) ;
148 sin.sin_port = htons( _portVal ) ;
149 pProtoEnt = getprotobyname(
"tcp" ) ;
152 string err(
"Error retreiving tcp protocol information" ) ;
157 int descript = socket( AF_INET, SOCK_STREAM, pProtoEnt->p_proto ) ;
169 string err(
"getting socket descriptor: ");
170 const char* error_info = strerror(errno);
172 err += (string)error_info;
179 holder = fcntl(
_socket, F_GETFL, NULL);
180 holder = holder | O_NONBLOCK;
181 fcntl(
_socket, F_SETFL, holder);
184 setTcpRecvBufferSize( ) ;
185 setTcpSendBufferSize( ) ;
187 int res =
::connect( descript, (
struct sockaddr*)&sin,
sizeof( sin ) );
192 if(errno == EINPROGRESS) {
195 struct timeval timeout ;
204 if( select( maxfd+1, NULL, &write_fd, NULL, &timeout) < 0 ) {
207 holder = fcntl(
_socket, F_GETFL, NULL);
208 holder = holder & (~O_NONBLOCK);
209 fcntl(
_socket, F_SETFL, holder);
212 string err(
"selecting sockets: " ) ;
213 const char *error_info = strerror( errno ) ;
215 err += (string)error_info ;
226 getsockopt(
_socket, SOL_SOCKET, SO_ERROR, (
void*) &valopt, &lon);
232 holder = fcntl(
_socket, F_GETFL, NULL);
233 holder = holder & (~O_NONBLOCK);
234 fcntl(
_socket, F_SETFL, holder);
237 string err(
"Did not successfully connect to server\n");
238 err +=
"Server may be down or you may be trying on the wrong port";
245 holder = fcntl(
_socket, F_GETFL, NULL);
246 holder = holder & (~O_NONBLOCK);
247 fcntl(
_socket, F_SETFL, holder);
258 holder = fcntl(
_socket, F_GETFL, NULL);
259 holder = holder & (~O_NONBLOCK);
260 fcntl(
_socket, F_SETFL, holder);
263 string err(
"socket connect: ");
264 const char* error_info = strerror(errno);
266 err += (string)error_info;
276 holder = fcntl(
_socket, F_GETFL, NULL);
277 holder = holder & (~O_NONBLOCK);
278 fcntl(
_socket, F_SETFL, holder);
289 string err(
"Socket is already connected" ) ;
295 string err(
"Socket is already listening" ) ;
300 struct sockaddr_in server ;
301 server.sin_family = AF_INET ;
302 server.sin_addr.s_addr = INADDR_ANY ;
303 struct servent *sir = 0 ;
304 sir = getservbyport( _portVal,
"tcp" ) ;
307 string error = sir->s_name + (string)
" is using my socket" ;
310 server.sin_port = htons( _portVal ) ;
311 _socket = socket( AF_INET, SOCK_STREAM, 0 ) ;
314 if( setsockopt(
_socket, SOL_SOCKET, SO_REUSEADDR,
315 (
char*)&on,
sizeof( on ) ) )
317 string error(
"could not set SO_REUSEADDR on TCP socket" ) ;
318 const char* error_info = strerror( errno ) ;
320 error +=
" " + (string)error_info ;
324 if( bind(
_socket, (
struct sockaddr*)&server,
sizeof server) != -1 )
326 int length =
sizeof( server ) ;
327 #ifdef _GETSOCKNAME_USES_SOCKLEN_T 328 if( getsockname(
_socket, (
struct sockaddr *)&server,
329 (socklen_t *)&length ) == -1 )
331 if( getsockname(
_socket, (
struct sockaddr *)&server,
335 string error(
"getting socket name" ) ;
336 const char* error_info = strerror( errno ) ;
338 error +=
" " + (string)error_info ;
344 setTcpRecvBufferSize( ) ;
345 setTcpSendBufferSize( ) ;
353 string error(
"could not listen TCP socket" ) ;
354 const char* error_info = strerror( errno ) ;
356 error +=
" " + (string)error_info ;
362 string error(
"could not bind TCP socket" ) ;
363 const char* error_info = strerror( errno ) ;
365 error +=
" " + (string)error_info ;
371 string error(
"could not create socket" ) ;
372 const char *error_info = strerror( errno ) ;
374 error +=
" " + (string)error_info ;
398 TcpSocket::setTcpRecvBufferSize()
400 if( !_haveRecvBufferSize )
415 if( setit ==
"Yes" || setit ==
"yes" || setit ==
"Yes" )
421 istringstream sizestrm( sizestr ) ;
422 unsigned int sizenum = 0 ;
423 sizestrm >> sizenum ;
426 string err =
"Socket Recv Size malformed: " + sizestr ;
431 int err = setsockopt(
_socket, SOL_SOCKET, SO_RCVBUF,
432 (
char *)&sizenum, (socklen_t)
sizeof(sizenum) ) ;
433 int myerrno = errno ;
436 char *serr = strerror( myerrno ) ;
437 string err =
"Failed to set the socket receive buffer size: " ;
441 err +=
"unknow error occurred" ;
445 BESDEBUG(
"ppt",
"Tcp receive buffer size set to " 446 << (
unsigned long)sizenum << endl ) ;
470 TcpSocket::setTcpSendBufferSize()
473 vector<string> vals ;
485 if( setit ==
"Yes" || setit ==
"yes" || setit ==
"Yes" )
498 istringstream sizestrm( sizestr ) ;
499 unsigned int sizenum = 0 ;
500 sizestrm >> sizenum ;
503 string err =
"Socket Send Size malformed: " + sizestr ;
508 int err = setsockopt(
_socket, SOL_SOCKET, SO_SNDBUF,
509 (
char *)&sizenum, (socklen_t)
sizeof(sizenum) ) ;
510 int myerrno = errno ;
513 char *serr = strerror( myerrno ) ;
514 string err =
"Failed to set the socket send buffer size: " ;
518 err +=
"unknow error occurred" ;
522 BESDEBUG(
"ppt",
"Tcp send buffer size set to " 523 << (
unsigned long)sizenum << endl ) ;
538 if( !_haveRecvBufferSize )
541 unsigned int sizenum = 0 ;
542 socklen_t sizelen =
sizeof(sizenum) ;
543 int err = getsockopt(
_socket, SOL_SOCKET, SO_RCVBUF,
544 (
char *)&sizenum, (socklen_t *)&sizelen ) ;
545 int myerrno = errno ;
548 char *serr = strerror( myerrno ) ;
549 string err =
"Failed to get the socket receive buffer size: " ;
553 err +=
"unknow error occurred" ;
557 BESDEBUG(
"ppt",
"Tcp receive buffer size is " 558 << (
unsigned long)sizenum << endl ) ;
560 _haveRecvBufferSize = true ;
561 _recvBufferSize = sizenum ;
563 return _recvBufferSize ;
577 if( !_haveSendBufferSize )
580 unsigned int sizenum = 0 ;
581 socklen_t sizelen =
sizeof(sizenum) ;
582 int err = getsockopt(
_socket, SOL_SOCKET, SO_SNDBUF,
583 (
char *)&sizenum, (socklen_t *)&sizelen ) ;
584 int myerrno = errno ;
587 char *serr = strerror( myerrno ) ;
588 string err =
"Failed to get the socket send buffer size: " ;
592 err +=
"unknow error occurred" ;
596 BESDEBUG(
"ppt",
"Tcp send buffer size is " 597 << (
unsigned long)sizenum << endl ) ;
599 _haveSendBufferSize = true ;
600 _sendBufferSize = sizenum ;
602 return _sendBufferSize ;
614 struct request_info req ;
615 request_init( &req, RQ_DAEMON,
"besdaemon", RQ_FILE,
619 if( STR_EQ( eval_hostname(), paranoid ) && hosts_access() )
638 << (
void *)
this <<
")" << endl ;
642 strm <<
BESIndent::LMarg <<
"have recv buffer size: " << _haveRecvBufferSize
646 strm <<
BESIndent::LMarg <<
"have send buffer size: " << _haveSendBufferSize
virtual unsigned int getRecvBufferSize()
get the tcp receive buffer size using getsockopt
exception thrown if an internal error is found and is fatal to the BES
exception thrown if inernal error encountered
virtual string get_file()
get the file name where the exception was thrown
virtual string get_message()
get the error message for this exception
Abstract exception class for the BES with basic string message.
virtual unsigned int getSendBufferSize()
get the tcp send buffer size using getsockopt
static ostream & LMarg(ostream &strm)
virtual void dump(ostream &strm) const
dumps information about this object
virtual int getSocketDescriptor()
void get_value(const string &s, string &val, bool &found)
Retrieve the value of a given key, if set.
virtual void dump(ostream &strm) const
dumps information about this object
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream
static BESKeys * TheKeys()
virtual bool allowConnection()
is there any wrapper code for unix sockets
virtual int get_line()
get the line number where the exception was thrown