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