示例#1
0
文件: tcp.c 项目: eagles125/pyuv
static PyObject *
TCP_func_bind(TCP *self, PyObject *args)
{
    int r;
    struct sockaddr sa;
    PyObject *addr;

    RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL);
    RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL);

    if (!PyArg_ParseTuple(args, "O:bind", &addr)) {
        return NULL;
    }

    if (pyuv_parse_addr_tuple(addr, &sa) < 0) {
        /* Error is set by the function itself */
        return NULL;
    }

    if (sa.sa_family == AF_INET) {
        r = uv_tcp_bind(&self->tcp_h, *(struct sockaddr_in *)&sa);
    } else {
        r = uv_tcp_bind6(&self->tcp_h, *(struct sockaddr_in6 *)&sa);
    }

    if (r != 0) {
        RAISE_UV_EXCEPTION(UV_HANDLE_LOOP(self), PyExc_TCPError);
        return NULL;
    }

    Py_RETURN_NONE;
}
示例#2
0
文件: udp.c 项目: imclab/pyuv
static PyObject *
UDP_func_bind(UDP *self, PyObject *args)
{
    int err, flags;
    struct sockaddr_storage ss;
    PyObject *addr;

    RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL);
    RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL);

    flags = 0;

    if (!PyArg_ParseTuple(args, "O|i:bind", &addr, &flags)) {
        return NULL;
    }

    if (pyuv_parse_addr_tuple(addr, &ss) < 0) {
        /* Error is set by the function itself */
        return NULL;
    }

    err = uv_udp_bind(&self->udp_h, (struct sockaddr *)&ss, flags);
    if (err < 0) {
        RAISE_UV_EXCEPTION(err, PyExc_UDPError);
        return NULL;
    }

    Py_RETURN_NONE;
}
示例#3
0
文件: tcp.c 项目: eagles125/pyuv
static PyObject *
TCP_func_connect(TCP *self, PyObject *args)
{
    int r;
    struct sockaddr sa;
    uv_connect_t *connect_req = NULL;
    PyObject *addr, *callback;

    RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL);
    RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL);

    if (!PyArg_ParseTuple(args, "OO:connect", &addr, &callback)) {
        return NULL;
    }

    if (!PyCallable_Check(callback)) {
        PyErr_SetString(PyExc_TypeError, "a callable is required");
        return NULL;
    }

    if (pyuv_parse_addr_tuple(addr, &sa) < 0) {
        /* Error is set by the function itself */
        return NULL;
    }

    Py_INCREF(callback);

    connect_req = PyMem_Malloc(sizeof *connect_req);
    if (!connect_req) {
        PyErr_NoMemory();
        goto error;
    }

    connect_req->data = callback;

    if (sa.sa_family == AF_INET) {
        r = uv_tcp_connect(connect_req, &self->tcp_h, *(struct sockaddr_in *)&sa, on_tcp_client_connection);
    } else {
        r = uv_tcp_connect6(connect_req, &self->tcp_h, *(struct sockaddr_in6 *)&sa, on_tcp_client_connection);
    }

    if (r != 0) {
        RAISE_UV_EXCEPTION(UV_HANDLE_LOOP(self), PyExc_TCPError);
        goto error;
    }

    /* Increase refcount so that object is not removed before the callback is called */
    Py_INCREF(self);

    Py_RETURN_NONE;

error:
    Py_DECREF(callback);
    PyMem_Free(connect_req);
    return NULL;
}
示例#4
0
文件: udp.c 项目: imclab/pyuv
static PyObject *
UDP_func_sendlines(UDP *self, PyObject *args)
{
    int i, err, buf_count;
    struct sockaddr_storage ss;
    PyObject *addr, *callback, *seq;
    Py_buffer *views;
    uv_buf_t *bufs;
    udp_send_ctx *ctx;

    callback = Py_None;
    ctx = NULL;

    RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL);
    RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL);

    if (!PyArg_ParseTuple(args, "OO|O:sendlines", &addr, &seq, &callback)) {
        return NULL;
    }

    if (callback != Py_None && !PyCallable_Check(callback)) {
        PyErr_SetString(PyExc_TypeError, "a callable or None is required");
        return NULL;
    }

    if (pyuv_parse_addr_tuple(addr, &ss) < 0) {
        /* Error is set by the function itself */
        return NULL;
    }

    err = pyseq2uvbuf(seq, &views, &bufs, &buf_count);
    if (err != 0) {
        /* error is already set */
        return NULL;
    }

    Py_INCREF(callback);

    ctx = PyMem_Malloc(sizeof *ctx);
    if (!ctx) {
        PyErr_NoMemory();
        goto error;
    }

    ctx->callback = callback;
    ctx->view_count = buf_count;
    ctx->views = views;

    err = uv_udp_send(&ctx->req, &self->udp_h, bufs, buf_count, (struct sockaddr *)&ss, (uv_udp_send_cb)on_udp_send);

    /* uv_write copies the uv_buf_t structures, so we can free them now */
    PyMem_Free(bufs);
    bufs = NULL;

    if (err < 0) {
        RAISE_UV_EXCEPTION(err, PyExc_UDPError);
        goto error;
    }

    /* Increase refcount so that object is not removed before the callback is called */
    Py_INCREF(self);

    Py_RETURN_NONE;

error:
    Py_DECREF(callback);
    for (i = 0; i < buf_count; i++) {
        PyBuffer_Release(&views[i]);
    }
    PyMem_Free(views);
    PyMem_Free(bufs);
    PyMem_Free(ctx);
    return NULL;
}
示例#5
0
文件: udp.c 项目: imclab/pyuv
static PyObject *
UDP_func_send(UDP *self, PyObject *args)
{
    int err;
    struct sockaddr_storage ss;
    uv_buf_t buf;
    Py_buffer *view;
    PyObject *addr, *callback;
    udp_send_ctx *ctx;

    RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL);
    RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL);

    callback = Py_None;

    ctx = PyMem_Malloc(sizeof *ctx);
    if (!ctx) {
        PyErr_NoMemory();
        return NULL;
    }

    view = &ctx->view[0];

    if (!PyArg_ParseTuple(args, "O"PYUV_BYTES"*|O:send", &addr, view, &callback)) {
        PyMem_Free(ctx);
        return NULL;
    }

    if (callback != Py_None && !PyCallable_Check(callback)) {
        PyErr_SetString(PyExc_TypeError, "a callable or None is required");
        goto error;
    }

    if (pyuv_parse_addr_tuple(addr, &ss) < 0) {
        /* Error is set by the function itself */
        goto error;
    }

    Py_INCREF(callback);

    buf = uv_buf_init(view->buf, view->len);
    ctx->callback = callback;
    ctx->view_count = 1;
    ctx->views = view;

    err = uv_udp_send(&ctx->req, &self->udp_h, &buf, 1, (struct sockaddr *)&ss, (uv_udp_send_cb)on_udp_send);
    if (err < 0) {
        RAISE_UV_EXCEPTION(err, PyExc_UDPError);
        Py_DECREF(callback);
        goto error;
    }

    /* Increase refcount so that object is not removed before the callback is called */
    Py_INCREF(self);

    Py_RETURN_NONE;

error:
    PyBuffer_Release(view);
    PyMem_Free(ctx);
    return NULL;
}