error_code hpc_network_provider::start(rpc_channel channel, int port, bool client_only, io_modifer& ctx) { if (_listen_fd != -1) return ERR_SERVICE_ALREADY_RUNNING; _looper = get_io_looper(node(), ctx.queue, ctx.mode); dassert(channel == RPC_CHANNEL_TCP || channel == RPC_CHANNEL_UDP, "invalid given channel %s", channel.to_string()); char hostname[128]; gethostname(hostname, sizeof(hostname)); _address = ::dsn::rpc_address(HOST_TYPE_IPV4, hostname, port); if (!client_only) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); _listen_fd = create_tcp_socket(&addr); if (_listen_fd == -1) { dassert(false, "cannot create listen socket"); } int forcereuse = 1; if (setsockopt(_listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&forcereuse, sizeof(forcereuse)) != 0) { dwarn("setsockopt SO_REUSEDADDR failed, err = %s", strerror(errno)); } if (listen(_listen_fd, SOMAXCONN) != 0) { dwarn("listen failed, err = %s", strerror(errno)); return ERR_NETWORK_START_FAILED; } _accept_event.callback = [this](int err, uint32_t size, uintptr_t lpolp) { this->do_accept(); }; // bind for accept _looper->bind_io_handle((dsn_handle_t)(intptr_t)_listen_fd, &_accept_event.callback, EVFILT_READ, nullptr // network_provider is a global object ); } return ERR_OK; }
error_code hpc_network_provider::start(rpc_channel channel, int port, bool client_only, io_modifer& ctx) { if (_listen_fd != INVALID_SOCKET) return ERR_SERVICE_ALREADY_RUNNING; _looper = get_io_looper(node(), ctx.queue, ctx.mode); dassert(channel == RPC_CHANNEL_TCP || channel == RPC_CHANNEL_UDP, "invalid given channel %s", channel.to_string()); char name[128]; gethostname(name, sizeof(name)); _address = ::dsn::rpc_address(HOST_TYPE_IPV4, name, port); if (!client_only) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); _listen_fd = create_tcp_socket(&addr); if (_listen_fd == INVALID_SOCKET) { dassert(false, ""); } int forcereuse = 1; if (setsockopt(_listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&forcereuse, sizeof(forcereuse)) != 0) { dwarn("setsockopt SO_REUSEDADDR failed, err = %d", ::GetLastError()); } _looper->bind_io_handle((dsn_handle_t)_listen_fd, &_accept_event.callback); if (listen(_listen_fd, SOMAXCONN) != 0) { dwarn("listen failed, err = %d", ::GetLastError()); return ERR_NETWORK_START_FAILED; } do_accept(); } return ERR_OK; }
error_code sim_network_provider::start(rpc_channel channel, int port, bool client_only) { dassert(channel == RPC_CHANNEL_TCP || channel == RPC_CHANNEL_UDP, "invalid given channel %s", channel.to_string()); _address = end_point(boost::asio::ip::host_name().c_str(), port); end_point ep2 = end_point("localhost", port); if (!client_only) { if (s_switch[channel].put(_address, this)) { s_switch[channel].put(ep2, this); return ERR_SUCCESS; } else return ERR_ADDRESS_ALREADY_USED; } else { return ERR_SUCCESS; } }
error_code sim_network_provider::start(rpc_channel channel, int port, bool client_only, io_modifer& ctx) { dassert(channel == RPC_CHANNEL_TCP || channel == RPC_CHANNEL_UDP, "invalid given channel %s", channel.to_string()); _address = ::dsn::rpc_address("localhost", port); auto hostname = boost::asio::ip::host_name(); if (!client_only) { for (int i = NET_HDR_INVALID + 1; i <= network_header_format::max_value(); i++) { if (s_switch[channel][i].put(_address, this)) { auto ep2 = ::dsn::rpc_address(hostname.c_str(), port); s_switch[channel][i].put(ep2, this); } else { return ERR_ADDRESS_ALREADY_USED; } } return ERR_OK; } else { return ERR_OK; } }
error_code asio_network_provider::start(rpc_channel channel, int port, bool client_only) { if (_acceptor != nullptr) return ERR_SERVICE_ALREADY_RUNNING; dassert(channel == RPC_CHANNEL_TCP || channel == RPC_CHANNEL_UDP, "invalid given channel %s", channel.to_string()); _address = end_point(boost::asio::ip::host_name().c_str(), port); if (!client_only) { auto v4_addr = boost::asio::ip::address_v4::any(); //(ntohl(_address.ip)); ::boost::asio::ip::tcp::endpoint ep(v4_addr, _address.port); try { _acceptor.reset(new boost::asio::ip::tcp::acceptor(_io_service, ep, true)); do_accept(); } catch (boost::system::system_error& err) { printf("boost asio listen on port %u failed, err: %s\n", port, err.what()); return ERR_ADDRESS_ALREADY_USED; } } return ERR_OK; }