const char* aio_stream::get_local(bool full /* = false */) const { if (stream_ == NULL) return dummy_; ACL_VSTREAM* vs = acl_aio_vstream(stream_); const char* ptr = ACL_VSTREAM_LOCAL(vs); ACL_SOCKET fd = ACL_VSTREAM_SOCK(vs); if (ptr == NULL || *ptr == 0) { char buf[256]; if (acl_getsockname(fd, buf, sizeof(buf)) == -1) return dummy_; acl_vstream_set_local(vs, buf); } ptr = ACL_VSTREAM_LOCAL(vs); if (full) return ptr; else if (local_ip_[0] != 0) return local_ip_; return const_cast<aio_stream*> (this)->get_ip(ptr, const_cast<aio_stream*>(this)->local_ip_, sizeof(local_ip_)); }
const char* socket_stream::get_local_ip() const { if (stream_ == NULL) return dummy_; // xxx: acl_vstream 中没有对此地址赋值 if (local_ip_[0] != 0) return local_ip_; char* ptr = ACL_VSTREAM_LOCAL(stream_); if (ptr == NULL || *ptr == 0) { char buf[256]; if (acl_getsockname(ACL_VSTREAM_SOCK(stream_), buf, sizeof(buf)) == -1) { return dummy_; } acl_vstream_set_local(stream_, buf); } return const_cast<socket_stream*>(this)->get_ip( ACL_VSTREAM_LOCAL(stream_), const_cast<socket_stream*>(this)->local_ip_, sizeof(local_ip_)); }
bool socket_stream::set_local(const char* addr) { if (stream_ == NULL) { logger_error("stream not opened yet!"); return false; } acl_vstream_set_local(stream_, addr); return true; }
const char* socket_stream::get_local(bool full /* = false */) const { if (stream_ == NULL) return dummy_; // xxx: acl_vstream 中没有对此地址赋值 char* ptr = ACL_VSTREAM_LOCAL(stream_); if (ptr == NULL || *ptr == 0) { char buf[256]; if (acl_getsockname(ACL_VSTREAM_SOCK(stream_), buf, sizeof(buf)) == -1) { return dummy_; } acl_vstream_set_local(stream_, buf); } if (full) return ACL_VSTREAM_LOCAL(stream_); else return get_local_ip(); }
ACL_VSTREAM *acl_vstream_listen_ex(const char *addr, int qlen, int block_mode, int io_bufsize, int io_timeout) { const char *myname = "acl_vstream_listen_ex"; ACL_SOCKET listenfd; struct sockaddr_in local; ACL_VSTREAM *listen_stream; int len; if (addr == 0 || *addr == 0 || qlen <= 0) { acl_msg_error("%s: input invalid", myname); return NULL; } #ifdef ACL_UNIX /* this maybe unix addr, such as '/home/test/listen.sock' */ if (strchr(addr, '/') != NULL) { listenfd = acl_unix_listen(addr, qlen, 0); if (listenfd == ACL_SOCKET_INVALID) return NULL; acl_non_blocking(listenfd, block_mode); listen_stream = acl_vstream_fdopen(listenfd, ACL_VSTREAM_FLAG_RW, io_bufsize, io_timeout, ACL_VSTREAM_TYPE_LISTEN_UNIX); if (listen_stream == NULL) { acl_socket_close(listenfd); acl_msg_error("%s: open vstream error, addr(%s)", myname, addr); return NULL; } acl_vstream_set_local(listen_stream, addr); sprintf(listen_stream->errbuf, "+OK"); return (listen_stream); } #endif /* addr such as '192.168.0.1:80' */ listenfd = acl_inet_listen(addr, qlen, block_mode); if (listenfd == ACL_SOCKET_INVALID) { acl_msg_error("%s: listen addr(%s) error(%s)", myname, addr, acl_last_serror()); return NULL; } listen_stream = acl_vstream_fdopen(listenfd, ACL_VSTREAM_FLAG_RW, io_bufsize, io_timeout, ACL_VSTREAM_TYPE_LISTEN_INET); if (listen_stream == NULL) { acl_socket_close(listenfd); acl_msg_error("%s: open vstream error addr(%s)", myname, addr); return NULL; } memset(&local, 0, sizeof(local)); len = (int) sizeof(struct sockaddr); if (getsockname(listenfd, (struct sockaddr*) &local, (socklen_t *) &len) < 0) { acl_msg_warn("%s: getsockname error(%s) for sock(%d)", myname, acl_last_serror(), listenfd); acl_vstream_set_local(listen_stream, addr); } else { char ip[32], buf[64]; int port; acl_inet_ntoa(local.sin_addr, ip, sizeof(ip)); port = ntohs(local.sin_port); snprintf(buf, sizeof(buf), "%s:%d", ip, port); acl_vstream_set_local(listen_stream, buf); } sprintf(listen_stream->errbuf, "+OK"); return listen_stream; }