/*----------------------------------------------------------------------------*/ int CreateListeningSocket(struct thread_context *ctx) { int listener; struct mtcp_epoll_event ev; struct sockaddr_in saddr; int ret; /* create socket and set it as nonblocking */ listener = mtcp_socket(ctx->mctx, AF_INET, SOCK_STREAM, 0); if (listener < 0) { TRACE_ERROR("Failed to create listening socket!\n"); printf("Failed to create listening socket!\n"); return -1; } ret = mtcp_setsock_nonblock(ctx->mctx, listener); if (ret < 0) { TRACE_ERROR("Failed to set socket in nonblocking mode.\n"); return -1; } /* bind to port 80 */ saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = INADDR_ANY; saddr.sin_port = htons(PORT_NO); ret = mtcp_bind(ctx->mctx, listener, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); if (ret < 0) { TRACE_ERROR("Failed to bind to the listening socket!\n"); printf("Failed to bind to the listening socket!\n"); return -1; } /* listen (backlog: 4K) */ ret = mtcp_listen(ctx->mctx, listener, 4096); if (ret < 0) { TRACE_ERROR("mtcp_listen() failed!\n"); printf("mtcp_listen() failed!\n"); return -1; } /* wait for incoming accept events */ ev.events = MTCP_EPOLLIN; ev.data.sockid = listener; mtcp_epoll_ctl(ctx->mctx, ctx->ep, MTCP_EPOLL_CTL_ADD, listener, &ev); return listener; }
static void new_connection(struct ctx *ctx) { int ret; struct mtcp_epoll_event evctl; ctx->sockid = mtcp_socket(ctx->worker->mctx, AF_INET, MTCP_SOCK_STREAM, 0); if (ctx->sockid < 0) { perror("socket"); exit(1); } ret = mtcp_setsock_nonblock(ctx->worker->mctx, ctx->sockid); if (ret < 0) { fprintf(stderr, "Error: Failed to make socket nonblocking on core %d\n", ctx->worker->cpu); exit(1); } ret = mtcp_connect(ctx->worker->mctx, ctx->sockid, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret < 0 && errno != EINPROGRESS) { ctx->sockid = -1; UPDATE_STATE(ctx, STATE_IDLE); LOG_ERROR(ctx->worker, ERRSOURCE_CONNECT, errno); return; } evctl.events = MTCP_EPOLLOUT | MTCP_EPOLLHUP | MTCP_EPOLLRDHUP; evctl.data.sockid = ctx->sockid; ret = mtcp_epoll_ctl(ctx->worker->mctx, ctx->worker->ep, MTCP_EPOLL_CTL_ADD, ctx->sockid, &evctl); if (ret < 0) { perror("epoll_ctl"); exit(1); } UPDATE_STATE(ctx, STATE_CONNECTING); if (ctx->worker->sctx_map[ctx->sockid]) { fprintf(stderr, "Error: Replacing existing socket on core %d\n", ctx->worker->cpu); exit(1); } ctx->worker->sctx_map[ctx->sockid] = ctx; ctx->messages_left = messages_per_connection - 1; }