Remove copy-paste in socket initialization.
GitOrigin-RevId: f4de36f6ec62378adc2cc0a7b7ad7afdd6b0573f
This commit is contained in:
parent
943fc13900
commit
a2846362a0
@ -222,8 +222,7 @@ class SocketFdImpl : private IOCP::Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void on_error(Status status) {
|
void on_error(Status status) {
|
||||||
VLOG(fd) << get_native_fd().io_handle() << " "
|
VLOG(fd) << get_native_fd().io_handle() << " on error " << status;
|
||||||
<< "on error " << status;
|
|
||||||
{
|
{
|
||||||
auto lock = lock_.lock();
|
auto lock = lock_.lock();
|
||||||
pending_errors_.push(std::move(status));
|
pending_errors_.push(std::move(status));
|
||||||
@ -431,9 +430,6 @@ void SocketFdImplDeleter::operator()(SocketFdImpl *impl) {
|
|||||||
delete impl;
|
delete impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TD_PORT_POSIX
|
|
||||||
Status get_socket_pending_error(const NativeFd &fd) {
|
Status get_socket_pending_error(const NativeFd &fd) {
|
||||||
int error = 0;
|
int error = 0;
|
||||||
socklen_t errlen = sizeof(error);
|
socklen_t errlen = sizeof(error);
|
||||||
@ -447,39 +443,10 @@ Status get_socket_pending_error(const NativeFd &fd) {
|
|||||||
LOG(INFO) << "Can't load pending socket error: " << status;
|
LOG(INFO) << "Can't load pending socket error: " << status;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
SocketFd::SocketFd() = default;
|
Status init_socket_options(NativeFd &native_fd) {
|
||||||
SocketFd::SocketFd(SocketFd &&) = default;
|
|
||||||
SocketFd &SocketFd::operator=(SocketFd &&) = default;
|
|
||||||
SocketFd::~SocketFd() = default;
|
|
||||||
|
|
||||||
SocketFd::SocketFd(std::unique_ptr<detail::SocketFdImpl> impl) : impl_(impl.release()) {
|
|
||||||
}
|
|
||||||
Result<SocketFd> SocketFd::from_native_fd(NativeFd fd) {
|
|
||||||
TRY_STATUS(fd.set_is_blocking(false));
|
|
||||||
auto sock = fd.socket();
|
|
||||||
|
|
||||||
// TODO remove copypaste
|
|
||||||
#if TD_PORT_POSIX
|
|
||||||
int flags = 1;
|
|
||||||
#elif TD_PORT_WINDOWS
|
|
||||||
BOOL flags = TRUE;
|
|
||||||
#endif
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<const char *>(&flags), sizeof(flags));
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<const char *>(&flags), sizeof(flags));
|
|
||||||
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&flags), sizeof(flags));
|
|
||||||
// TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER
|
|
||||||
|
|
||||||
return SocketFd(std::make_unique<detail::SocketFdImpl>(std::move(fd)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Result<SocketFd> SocketFd::open(const IPAddress &address) {
|
|
||||||
NativeFd native_fd{socket(address.get_address_family(), SOCK_STREAM, 0)};
|
|
||||||
if (!native_fd) {
|
|
||||||
return OS_SOCKET_ERROR("Failed to create a socket");
|
|
||||||
}
|
|
||||||
TRY_STATUS(native_fd.set_is_blocking(false));
|
TRY_STATUS(native_fd.set_is_blocking(false));
|
||||||
|
|
||||||
auto sock = native_fd.socket();
|
auto sock = native_fd.socket();
|
||||||
@ -493,8 +460,33 @@ Result<SocketFd> SocketFd::open(const IPAddress &address) {
|
|||||||
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&flags), sizeof(flags));
|
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char *>(&flags), sizeof(flags));
|
||||||
// TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER
|
// TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER
|
||||||
|
|
||||||
|
return Status::OK();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
SocketFd::SocketFd() = default;
|
||||||
|
SocketFd::SocketFd(SocketFd &&) = default;
|
||||||
|
SocketFd &SocketFd::operator=(SocketFd &&) = default;
|
||||||
|
SocketFd::~SocketFd() = default;
|
||||||
|
|
||||||
|
SocketFd::SocketFd(std::unique_ptr<detail::SocketFdImpl> impl) : impl_(impl.release()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<SocketFd> SocketFd::from_native_fd(NativeFd fd) {
|
||||||
|
TRY_STATUS(detail::init_socket_options(fd));
|
||||||
|
return SocketFd(std::make_unique<detail::SocketFdImpl>(std::move(fd)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<SocketFd> SocketFd::open(const IPAddress &address) {
|
||||||
|
NativeFd native_fd{socket(address.get_address_family(), SOCK_STREAM, 0)};
|
||||||
|
if (!native_fd) {
|
||||||
|
return OS_SOCKET_ERROR("Failed to create a socket");
|
||||||
|
}
|
||||||
|
TRY_STATUS(detail::init_socket_options(native_fd));
|
||||||
|
|
||||||
#if TD_PORT_POSIX
|
#if TD_PORT_POSIX
|
||||||
int e_connect = connect(sock, address.get_sockaddr(), static_cast<socklen_t>(address.get_sockaddr_len()));
|
int e_connect = connect(native_fd.fd(), address.get_sockaddr(), narrow_cast<socklen_t>(address.get_sockaddr_len()));
|
||||||
if (e_connect == -1) {
|
if (e_connect == -1) {
|
||||||
auto connect_errno = errno;
|
auto connect_errno = errno;
|
||||||
if (connect_errno != EINPROGRESS) {
|
if (connect_errno != EINPROGRESS) {
|
||||||
@ -504,7 +496,7 @@ Result<SocketFd> SocketFd::open(const IPAddress &address) {
|
|||||||
return SocketFd(std::make_unique<detail::SocketFdImpl>(std::move(native_fd)));
|
return SocketFd(std::make_unique<detail::SocketFdImpl>(std::move(native_fd)));
|
||||||
#elif TD_PORT_WINDOWS
|
#elif TD_PORT_WINDOWS
|
||||||
auto bind_addr = address.get_any_addr();
|
auto bind_addr = address.get_any_addr();
|
||||||
auto e_bind = bind(sock, bind_addr.get_sockaddr(), narrow_cast<int>(bind_addr.get_sockaddr_len()));
|
auto e_bind = bind(native_fd.socket(), bind_addr.get_sockaddr(), narrow_cast<int>(bind_addr.get_sockaddr_len()));
|
||||||
if (e_bind != 0) {
|
if (e_bind != 0) {
|
||||||
return OS_SOCKET_ERROR("Failed to bind a socket");
|
return OS_SOCKET_ERROR("Failed to bind a socket");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user