Beispiel #1
0
/*----------------------------------------------------------------------------*/
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;
}
Beispiel #2
0
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;
}