41 #include <sys/types.h>
42 #include <sys/socket.h>
43 #include <netinet/in.h>
51 #include <sys/socket.h>
52 #include <arpa/inet.h>
58 #define DEFAULT_PORT 5500
59 #define DEFAULT_HOST "127.0.0.1"
61 UseSocket::UseSocket(
bool c)
72 UseSocket::UseSocket(
int t,
bool c)
83 UseSocket::~UseSocket(
void)
87 time_t t = time(NULL);
89 if (socket_type == SOCK_STREAM) {
90 status = shutdown(sock, SHUT_RDWR);
91 int save_errno = errno;
93 pedantic_cout(
"UseSocket::~UseSocket: shutdown: "
95 <<
" status=" << status
96 <<
" time=" << asctime(localtime(&t))
100 char *
msg = strerror(save_errno);
101 silent_cerr(
"UseSocket::~UseSocket: shutdown "
103 <<
" status=" << status
104 <<
" time=" << asctime(localtime(&t))
105 <<
" error=" << save_errno <<
" (" << msg <<
")"
110 status = close(sock);
111 pedantic_cout(
"UseSocket::~UseSocket: close: "
113 <<
" status=" << status
114 <<
" time=" << asctime(localtime(&t))
120 UseSocket::Restart(std::ostream& out)
const
123 switch (socket_type) {
134 out <<
", socket type, " << sType;
137 out <<
", create, yes";
144 UseSocket::GetSock(
void)
const
150 UseSocket::SetSock(
int s)
156 UseSocket::PostConnect(
void)
162 if (setsockopt(GetSock(), SOL_SOCKET, SO_LINGER, &lin,
sizeof(lin))) {
163 int save_errno = errno;
164 char *msg = strerror(save_errno);
166 silent_cerr(
"UseSocket::PostConnect: setsockopt() failed "
167 "(" << save_errno <<
": " << msg <<
")"
174 UseSocket::Connect(
void)
176 if (socket_type != SOCK_STREAM) {
185 for ( ; count > 0; count--) {
186 if (connect(sock, GetSockaddr(), GetSocklen()) < 0) {
187 int save_errno = errno;
188 switch (save_errno) {
197 char *msg = strerror(save_errno);
198 silent_cerr(
"UseSocket::Connect: connect() failed "
199 "(" << save_errno <<
": " << msg <<
")"
210 silent_cerr(
"UseSocket(): connection timed out"
216 UseSocket::ConnectSock(
int s)
226 UseSocket::Create(
void)
const
232 UseSocket::Connected(
void)
const
238 UseSocket::Abandon(
void)
244 UseSocket::Abandoned(
void)
const
250 UseSocket::GetSocklen(
void)
const
256 UseSocket::send(
const void *
buf,
size_t len,
int flags)
258 switch (socket_type) {
260 return ::send(sock, buf, len, flags);
263 return ::sendto(sock, buf, len, flags, GetSockaddr(), GetSocklen());
273 UseSocket::recv(
void *buf,
size_t len,
int flags)
275 switch (socket_type) {
277 return ::recv(sock, buf, len, flags);
283 return ::recvfrom(sock, buf, len, flags, 0, 0);
292 UseInetSocket::UseInetSocket(
const std::string& h,
unsigned short p,
bool c)
300 UseInetSocket::UseInetSocket(
const std::string& h,
unsigned short p,
int t,
bool c)
309 UseInetSocket::UseInetSocket_int(
void)
313 socklen =
sizeof(addr);
327 const char *err_msg = strerror(save_errno);
329 silent_cerr(
"UseInetSocket(" <<
host <<
":" <<
port <<
"): "
331 "(" << save_errno <<
": " << err_msg <<
")"
335 }
else if (sock == -2) {
336 const char *err_msg = strerror(save_errno);
338 silent_cerr(
"UseInetSocket(" <<
host <<
":" <<
port <<
"): "
340 "(" << save_errno <<
": " << err_msg <<
")"
344 }
else if (sock == -3) {
345 silent_cerr(
"UseInetSocket(" <<
host <<
":" <<
port <<
"): "
346 "illegal host name \"" <<
host <<
"\" "
347 "(" << save_errno <<
")"
352 if (socket_type == SOCK_STREAM) {
353 if (listen(sock, 1) < 0) {
355 const char *err_msg = strerror(save_errno);
357 silent_cerr(
"UseInetSocket(" <<
host <<
":" <<
port <<
"): "
359 "(" << save_errno <<
": " << err_msg <<
")"
367 UseInetSocket::~UseInetSocket(
void)
373 UseInetSocket::Restart(std::ostream& out)
const
375 UseSocket::Restart(out);
376 out <<
", port, " <<
port;
378 out <<
", host, " <<
"\"" <<
host <<
"\"";
384 UseInetSocket::Connect(
void)
391 sock = socket(PF_INET, SOCK_STREAM, 0);
393 silent_cerr(
"UseSocket(): socket() failed "
394 <<
"\"" <<
host <<
":" << port <<
"\""
399 addr.sin_family = AF_INET;
400 addr.sin_port = htons(port);
401 if (inet_aton(
host.c_str(), &addr.sin_addr) == 0) {
402 silent_cerr(
"UseSocket(): unknown host "
403 "\"" <<
host <<
":" << port <<
"\""
412 const char *err_msg = strerror(save_errno);
414 silent_cerr(
"UseInetSocket(" <<
host <<
":" << port <<
"): socket() failed "
415 "(" << save_errno <<
": " << err_msg <<
")"
420 pedantic_cout(
"connecting to inet socket "
421 "\"" << inet_ntoa(addr.sin_addr)
422 <<
":" << ntohs(addr.sin_port)
423 <<
"\" ..." << std::endl);
425 UseSocket::Connect();
429 UseInetSocket::ConnectSock(
int s)
431 UseSocket::ConnectSock(s);
433 silent_cout(
"INET connection to port=" << port <<
" by client "
434 <<
"\"" << inet_ntoa(addr.sin_addr)
435 <<
":" << ntohs(addr.sin_port) <<
"\""
440 UseInetSocket::GetSockaddr(
void)
const
442 return (
struct sockaddr *)&addr;
445 UseLocalSocket::UseLocalSocket(
const std::string& p,
bool c)
446 : UseSocket(c),
path(p)
448 UseLocalSocket_int();
451 UseLocalSocket::UseLocalSocket(
const std::string& p,
int t,
bool c)
452 : UseSocket(t, c),
path(p)
454 UseLocalSocket_int();
458 UseLocalSocket::UseLocalSocket_int(
void)
462 socklen =
sizeof(addr);
470 const char *err_msg = strerror(save_errno);
472 silent_cerr(
"UseLocalSocket(" <<
path <<
"): "
474 "(" << save_errno <<
": " << err_msg <<
")"
478 }
else if (sock == -2) {
479 const char *err_msg = strerror(save_errno);
481 silent_cerr(
"UseLocalSocket(" <<
path <<
"): "
483 "(" << save_errno <<
": " << err_msg <<
")"
488 if (socket_type == SOCK_STREAM) {
489 if (listen(sock, 1) < 0) {
491 const char *err_msg = strerror(save_errno);
493 silent_cerr(
"UseLocalSocket(" <<
path <<
"): "
495 "(" << save_errno <<
": " << err_msg <<
")"
503 UseLocalSocket::~UseLocalSocket(
void)
505 if (!
path.empty() && create) {
506 unlink(
path.c_str());
511 UseLocalSocket::Restart(std::ostream& out)
const
513 return UseSocket::Restart(out) <<
", path, " <<
"\"" <<
path <<
"\"";
517 UseLocalSocket::Connect(
void)
523 sock = socket(PF_LOCAL, socket_type, 0);
525 int save_errno = errno;
526 char *msg = strerror(save_errno);
528 silent_cerr(
"UseSocket(): socket() failed "
529 "(" << save_errno <<
": " << msg <<
")"
533 addr.sun_family = AF_UNIX;
534 if (
path.size() >=
sizeof(addr.sun_path)) {
535 silent_cerr(
"UseSocket(): path=\"" <<
path <<
"\" exceeds allowable size "
536 "of LOCAL socket path (" <<
sizeof(addr.sun_path) <<
")" << std::endl);
539 memcpy(addr.sun_path,
path.c_str(),
path.size() + 1);
541 pedantic_cout(
"connecting to local socket \"" <<
path <<
"\" ..."
544 UseSocket::Connect();
548 UseLocalSocket::ConnectSock(
int s)
550 UseSocket::ConnectSock(s);
552 silent_cout(
"LOCAL connection to path=\"" <<
path <<
"\""
557 UseLocalSocket::GetSockaddr(
void)
const
559 return (
struct sockaddr *)&addr;
#define MBDYN_EXCEPT_ARGS
int mbdyn_make_named_socket_type(struct sockaddr_un *name, const char *path, int socket_type, int dobind, int *perror)
int mbsleep(const mbsleep_t *t)
#define MBDYN_DEFAULT_SOCKET_TYPE
int mbdyn_make_inet_socket_type(struct sockaddr_in *name, const char *hostname, unsigned short int port, int socket_type, int dobind, int *perror)
#define ASSERT(expression)
static std::stack< cleanup * > c
int mbsleep_real2sleep(doublereal d, mbsleep_t *t)
static doublereal buf[BUFSIZE]