Go to the documentation of this file.
23 #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
27 #include <netinet/in.h>
30 #include <sys/socket.h>
31 #include <sys/types.h>
52 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
56 static int g_nconnects = 0;
82 test_addr addrs[MAX_ADDRS];
85 static on_connect_result g_result = {
nullptr, 0, 0, -1};
87 static char family_name_buf[1024];
88 static const char* sock_family_name(
int family) {
89 if (family == AF_INET) {
93 }
else if (family == AF_UNSPEC) {
96 sprintf(family_name_buf,
"%d", family);
97 return family_name_buf;
101 static void on_connect_result_init(on_connect_result*
result) {
108 static void on_connect_result_set(on_connect_result*
result,
118 server_weak_ref* weak_ref =
static_cast<server_weak_ref*
>(
arg);
119 weak_ref->server =
nullptr;
122 static void server_weak_ref_init(server_weak_ref* weak_ref) {
123 weak_ref->server =
nullptr;
125 weak_ref, grpc_schedule_on_exec_ctx);
133 static void server_weak_ref_set(server_weak_ref* weak_ref,
136 weak_ref->server =
server;
139 static void test_addr_init_str(test_addr*
addr) {
143 addr->str[str_len] =
'\0';
153 on_connect_result temp_result;
154 on_connect_result_set(&temp_result, acceptor);
158 g_result = temp_result;
177 static void test_no_op_with_start(
void) {
187 std::vector<grpc_pollset*> empty_pollset;
192 static void test_no_op_with_port(
void) {
195 struct sockaddr_in*
addr =
196 reinterpret_cast<struct sockaddr_in*
>(resolved_addr.
addr);
206 memset(&resolved_addr, 0,
sizeof(resolved_addr));
207 resolved_addr.
len =
static_cast<socklen_t
>(
sizeof(
struct sockaddr_in));
208 addr->sin_family = AF_INET;
217 static void test_no_op_with_port_and_start(
void) {
220 struct sockaddr_in*
addr =
221 reinterpret_cast<struct sockaddr_in*
>(resolved_addr.
addr);
229 LOG_TEST(
"test_no_op_with_port_and_start");
232 memset(&resolved_addr, 0,
sizeof(resolved_addr));
233 resolved_addr.
len =
static_cast<socklen_t
>(
sizeof(
struct sockaddr_in));
234 addr->sin_family = AF_INET;
239 std::vector<grpc_pollset*> empty_pollset;
246 on_connect_result*
result) {
250 int nconnects_before;
251 const struct sockaddr* remote_addr =
252 reinterpret_cast<const struct sockaddr*
>(remote->addr.addr);
256 nconnects_before = g_nconnects;
257 on_connect_result_init(&g_result);
258 clifd =
socket(remote_addr->sa_family, SOCK_STREAM, 0);
264 if (connect(clifd, remote_addr,
static_cast<socklen_t
>(remote->addr.len)) !=
271 while (g_nconnects == nconnects_before &&
286 if (g_nconnects != nconnects_before + 1) {
307 static void test_connect(
size_t num_connects,
309 test_addrs* dst_addrs,
bool test_dst_addrs) {
313 struct sockaddr_storage*
const addr =
314 reinterpret_cast<struct sockaddr_storage*
>(resolved_addr.
addr);
315 struct sockaddr_storage*
const addr1 =
316 reinterpret_cast<struct sockaddr_storage*
>(resolved_addr1.
addr);
317 unsigned svr_fd_count;
320 unsigned svr1_fd_count;
323 const unsigned num_ports = 2;
333 server_weak_ref weak_ref;
334 server_weak_ref_init(&weak_ref);
335 server_weak_ref_set(&weak_ref, s);
338 "clients=%lu, num chan args=%lu, remote IP=%s, test_dst_addrs=%d",
339 static_cast<unsigned long>(num_connects),
340 static_cast<unsigned long>(
341 channel_args !=
nullptr ? channel_args->
num_args : 0),
342 dst_addrs !=
nullptr ?
"<specific>" :
"::", test_dst_addrs);
343 memset(&resolved_addr, 0,
sizeof(resolved_addr));
344 memset(&resolved_addr1, 0,
sizeof(resolved_addr1));
345 resolved_addr.
len =
static_cast<socklen_t
>(
sizeof(
struct sockaddr_storage));
346 resolved_addr1.
len =
static_cast<socklen_t
>(
sizeof(
struct sockaddr_storage));
347 addr->ss_family = addr1->ss_family = AF_INET;
349 "grpc_tcp_server_add_port",
377 std::vector<grpc_pollset*> test_pollset;
381 if (dst_addrs !=
nullptr) {
382 int ports[] = {svr_port, svr1_port};
383 for (port_num = 0; port_num < num_ports; ++port_num) {
385 size_t num_tested = 0;
386 for (dst_idx = 0; dst_idx < dst_addrs->naddrs; ++dst_idx) {
387 test_addr
dst = dst_addrs->addrs[dst_idx];
390 if (
dst.addr.len == 0) {
396 test_addr_init_str(&
dst);
398 on_connect_result_init(&
result);
406 dst_addrs->addrs[dst_idx].addr.len = 0;
412 for (port_num = 0; port_num < num_ports; ++port_num) {
415 for (fd_num = 0; fd_num < num_fds; ++fd_num) {
420 dst.addr.len =
static_cast<socklen_t
>(
sizeof(
dst.addr.addr));
422 (socklen_t*)&
dst.addr.len) == 0);
424 test_addr_init_str(&
dst);
425 gpr_log(
GPR_INFO,
"(%d, %d) fd %d family %s listening on %s", port_num,
426 fd_num, fd, sock_family_name(
addr->ss_family),
dst.str);
427 for (connect_num = 0; connect_num < num_connects; ++connect_num) {
429 on_connect_result_init(&
result);
458 int main(
int argc,
char** argv) {
468 test_addrs* dst_addrs = grpc_core::Zalloc<test_addrs>();
482 test_no_op_with_start();
483 test_no_op_with_port();
484 test_no_op_with_port_and_start();
486 if (
getifaddrs(&ifa) != 0 || ifa ==
nullptr) {
490 dst_addrs->naddrs = 0;
491 for (ifa_it = ifa; ifa_it !=
nullptr && dst_addrs->naddrs < MAX_ADDRS;
495 }
else if (ifa_it->
ifa_addr->sa_family == AF_INET) {
496 dst_addrs->addrs[dst_addrs->naddrs].addr.len =
497 static_cast<socklen_t
>(
sizeof(
struct sockaddr_in));
499 dst_addrs->addrs[dst_addrs->naddrs].addr.len =
504 memcpy(dst_addrs->addrs[dst_addrs->naddrs].addr.addr, ifa_it->
ifa_addr,
505 dst_addrs->addrs[dst_addrs->naddrs].addr.len);
508 test_addr_init_str(&dst_addrs->addrs[dst_addrs->naddrs]);
515 test_connect(1,
nullptr,
nullptr,
false);
516 test_connect(10,
nullptr,
nullptr,
false);
520 test_connect(1,
nullptr, dst_addrs,
true);
523 test_connect(1, &channel_args, dst_addrs,
false);
525 test_connect(10, &channel_args, dst_addrs,
false);
528 grpc_schedule_on_exec_ctx);
539 int main(
int argc,
char** argv) {
return 1; }
struct grpc_pollset_worker grpc_pollset_worker
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
size_t grpc_pollset_size(void)
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
gpr_timespec grpc_timeout_seconds_to_deadline(int64_t time_s)
union grpc_arg::grpc_arg_value value
return memset(p, 0, total)
#define GRPC_ARG_EXPAND_WILDCARD_ADDRS
static uv_os_fd_t server_fd
unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s, unsigned port_index)
GPRAPI void gpr_free(void *ptr)
grpc_error_handle grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker **worker, grpc_core::Timestamp deadline)
#define GRPC_LOG_IF_ERROR(what, error)
absl::StatusOr< std::string > grpc_sockaddr_to_string(const grpc_resolved_address *resolved_addr, bool normalize)
void grpc_tcp_server_unref(grpc_tcp_server *s)
static grpc_pollset * g_pollset
void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu)
grpc_tcp_server * grpc_tcp_server_ref(grpc_tcp_server *s)
void grpc_tcp_server_start(grpc_tcp_server *server, const std::vector< grpc_pollset * > *pollsets, grpc_tcp_server_cb on_accept_cb, void *cb_arg)
GPRAPI void * gpr_zalloc(size_t size)
std::unique_ptr< Server > server
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
grpc_error_handle grpc_tcp_server_add_port(grpc_tcp_server *s, const grpc_resolved_address *addr, int *out_port)
#define GRPC_OS_ERROR(err, call_name)
create an error associated with errno!=0 (an 'operating system' error)
static const CoreConfiguration & Get()
def c_str(s, encoding='ascii')
struct sockaddr * ifa_addr
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
GPRAPI void gpr_sleep_until(gpr_timespec until)
const grpc_channel_args * ToC() const
void grpc_channel_args_destroy(grpc_channel_args *a)
GPRAPI void gpr_mu_lock(gpr_mu *mu)
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index, unsigned fd_index)
static void test_no_op(grpc_end2end_test_config config)
grpc_tcp_server * from_server
int grpc_pick_unused_port_or_die(void)
void grpc_endpoint_destroy(grpc_endpoint *ep)
grpc_error_handle grpc_pollset_kick(grpc_pollset *pollset, grpc_pollset_worker *specific_worker)
const ChannelArgsPreconditioning & channel_args_preconditioning() const
void on_connect(uv_connect_t *req, int status)
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
ABSL_NAMESPACE_BEGIN Time Now()
static void destroy_pollset(void *p, grpc_error_handle)
grpc_core::ExecCtx exec_ctx
std::string grpc_error_std_string(grpc_error_handle error)
void grpc_pollset_shutdown(grpc_pollset *pollset, grpc_closure *closure)
void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s, grpc_closure *shutdown_starting)
grpc_error_handle grpc_tcp_server_create(grpc_closure *shutdown_complete, const grpc_channel_args *args, grpc_tcp_server **server)
#define GRPC_ERROR_UNREF(err)
int main(int argc, char **argv)
struct ifaddrs * ifa_next
const T & value() const &ABSL_ATTRIBUTE_LIFETIME_BOUND
void freeifaddrs(struct ifaddrs *ifa)
__BEGIN_DECLS int getifaddrs(struct ifaddrs **ifap)
GRPCAPI void grpc_init(void)
static Timestamp FromTimespecRoundUp(gpr_timespec t)
void grpc_pollset_destroy(grpc_pollset *pollset)
char addr[GRPC_MAX_SOCKADDR_SIZE]
GRPCAPI void grpc_shutdown(void)
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:29