示例#1
0
int aio_socket_connect(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, aio_onconnect proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

	ctx->out.connect.addrlen = addrlen > sizeof(ctx->out.connect.addr) ? sizeof(ctx->out.connect.addr) : addrlen;
	memcpy(&ctx->out.connect.addr, addr, ctx->out.connect.addrlen);
	ctx->out.connect.proc = proc;
	ctx->out.connect.param = param;

    //r = kqueue_connect(ctx, 0, 0);
    addrlen = sizeof(ctx->out.connect.addr);
    r = connect(ctx->socket, (const struct sockaddr*)&ctx->out.connect.addr, ctx->out.connect.addrlen);
    if(0 == r)
    {
        // man 2 connect to see more(ERRORS: EINPROGRESS)
        addrlen = sizeof(r);
        if(0 == getsockopt(ctx->socket, SOL_SOCKET, SO_ERROR, (void*)&r, &addrlen) && 0 == r)
            ctx->out.connect.proc(ctx->out.connect.param, r);
        return r;
    }

    if(EINPROGRESS == errno)
    {
    	KQueueWrite(ctx, kqueue_connect);
	}

	return 0 == r ? 0 : errno;
}
示例#2
0
int aio_socket_connect(aio_socket_t socket, const char* ip, int port, aio_onconnect proc, void* param)
{
    int r = -1;
    socklen_t addrlen;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

    ctx->out.connect.addr.sin_family = AF_INET;
    ctx->out.connect.addr.sin_port = htons(port);
    ctx->out.connect.addr.sin_addr.s_addr = inet_addr(ip);
    ctx->out.connect.proc = proc;
    ctx->out.connect.param = param;

    //r = kqueue_connect(ctx, 0, 0);
    addrlen = sizeof(ctx->out.connect.addr);
    r = connect(ctx->socket, (const struct sockaddr*)&ctx->out.connect.addr, addrlen);
    if(0 == r)
    {
        // man 2 connect to see more(ERRORS: EINPROGRESS)
        addrlen = sizeof(r);
        if(0 == getsockopt(ctx->socket, SOL_SOCKET, SO_ERROR, (void*)&r, &addrlen) && 0 == r)
            ctx->out.connect.proc(ctx->out.connect.param, r);
        return r;
    }

    if(EINPROGRESS == errno)
    {
        KQueueWrite(ctx, kqueue_connect);
    }

    return 0 == r ? 0 : errno;
}
示例#3
0
int aio_socket_send_v(aio_socket_t socket, socket_bufvec_t* vec, int n, aio_onsend proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

	ctx->out.send_v.proc = proc;
	ctx->out.send_v.param = param;
	ctx->out.send_v.vec = vec;
	ctx->out.send_v.n = n;

//    r = kqueue_send_v(ctx, 0, 0);
//	if(EAGAIN == r)
	{
        KQueueWrite(ctx, kqueue_send_v);
	}

    return 0 == r ? 0 : errno;
}
示例#4
0
int aio_socket_send(aio_socket_t socket, const void* buffer, size_t bytes, aio_onsend proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

	ctx->out.send.proc = proc;
	ctx->out.send.param = param;
	ctx->out.send.buffer = buffer;
	ctx->out.send.bytes = bytes;

//    r = kqueue_send(ctx, 0, 0);
//	if(EAGAIN == r)
	{
        KQueueWrite(ctx, kqueue_send);
	}

    return 0 == r ? 0 : errno;
}
示例#5
0
int aio_socket_sendto_v(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, socket_bufvec_t* vec, int n, aio_onsend proc, void* param)
{
    int r = -1;
	struct kqueue_context* ctx = (struct kqueue_context*)socket;
	assert(0 == ctx->ev[1].filter);
	if(ctx->ev[1].filter)
		return EBUSY;

	ctx->out.send_v.addrlen = addrlen > sizeof(ctx->out.send_v.addr) ? sizeof(ctx->out.send_v.addr) : addrlen;
	memcpy(&ctx->out.send_v.addr, addr, ctx->out.send_v.addrlen);
	ctx->out.send_v.proc = proc;
	ctx->out.send_v.param = param;
	ctx->out.send_v.vec = vec;
	ctx->out.send_v.n = n;

//    r = kqueue_sendto_v(ctx, 0, 0);
//	if(EAGAIN == r)
	{
        KQueueWrite(ctx, kqueue_sendto_v);
	}

    return 0 == r ? 0 : errno;
}
示例#6
0
int aio_socket_sendto(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, const void* buffer, size_t bytes, aio_onsend proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

	ctx->out.send.addrlen = addrlen > sizeof(ctx->out.send.addr) ? sizeof(ctx->out.send.addr) : addrlen;
	memcpy(&ctx->out.send.addr, addr, ctx->out.send.addrlen);
	ctx->out.send.proc = proc;
	ctx->out.send.param = param;
	ctx->out.send.buffer = buffer;
	ctx->out.send.bytes = bytes;

//    r = kqueue_sendto(ctx, 0, 0);
//	if(EAGAIN == r)
	{
        KQueueWrite(ctx, kqueue_sendto);
	}

    return 0 == r ? 0 : errno;
}
示例#7
0
int aio_socket_sendto_v(aio_socket_t socket, const char* ip, int port, socket_bufvec_t* vec, int n, aio_onsend proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

    ctx->out.send_v.addr.sin_family = AF_INET;
    ctx->out.send_v.addr.sin_port = htons(port);
    ctx->out.send_v.addr.sin_addr.s_addr = inet_addr(ip);
    ctx->out.send_v.proc = proc;
    ctx->out.send_v.param = param;
    ctx->out.send_v.vec = vec;
    ctx->out.send_v.n = n;

//    r = kqueue_sendto_v(ctx, 0, 0);
//	if(EAGAIN == r)
    {
        KQueueWrite(ctx, kqueue_sendto_v);
    }

    return 0 == r ? 0 : errno;
}
示例#8
0
int aio_socket_sendto(aio_socket_t socket, const char* ip, int port, const void* buffer, size_t bytes, aio_onsend proc, void* param)
{
    int r = -1;
    struct kqueue_context* ctx = (struct kqueue_context*)socket;
    assert(0 == ctx->ev[1].filter);
    if(ctx->ev[1].filter)
        return EBUSY;

    ctx->out.send.addr.sin_family = AF_INET;
    ctx->out.send.addr.sin_port = htons(port);
    ctx->out.send.addr.sin_addr.s_addr = inet_addr(ip);
    ctx->out.send.proc = proc;
    ctx->out.send.param = param;
    ctx->out.send.buffer = buffer;
    ctx->out.send.bytes = bytes;

//    r = kqueue_sendto(ctx, 0, 0);
//	if(EAGAIN == r)
    {
        KQueueWrite(ctx, kqueue_sendto);
    }

    return 0 == r ? 0 : errno;
}