zoukankan      html  css  js  c++  java
  • libuv::tcp

    #include <cstdio>
    #include <stdio.h>
    #include <stdlib.h>
    #include <libuv/uv.h>
    #include <inttypes.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define DEFAULT_PORT 7000
    #define DEFAULT_BACKLOG 128
    
    uv_loop_t* loop;
    struct sockaddr_in addr;
    
    typedef struct {
        uv_write_t req;
        uv_buf_t buf;
    } write_req_t;
    
    void free_write_req(uv_write_t* req) {
        write_req_t* wr = (write_req_t*)req;
        free(wr->buf.base);
        free(wr);
    }
    
    void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
        buf->base = (char*)malloc(suggested_size);
        buf->len = suggested_size;
    }
    
    void echo_write(uv_write_t* req, int status) {
        if (status) {
            fprintf(stderr, "Write error %s
    ", uv_strerror(status));
        }
        free_write_req(req);
    }
    
    void echo_read(uv_stream_t* client, ssize_t nread, const uv_buf_t* buf) {
        if (nread > 0) {
            write_req_t* req = (write_req_t*)malloc(sizeof(write_req_t));
            req->buf = uv_buf_init(buf->base, nread);
            uv_write((uv_write_t*)req, client, &req->buf, 1, echo_write);
            return;
        }
        if (nread < 0) {
            if (nread != UV_EOF)
                fprintf(stderr, "Read error %s
    ", uv_err_name(nread));
            uv_close((uv_handle_t*)client, NULL);
        }
    
        free(buf->base);
    }
    
    void on_new_connection(uv_stream_t* server, int status) {
        if (status < 0) {
            fprintf(stderr, "New connection error %s
    ", uv_strerror(status));
            // error!
            return;
        }
    
        uv_tcp_t* client = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));
        uv_tcp_init(loop, client);
        if (uv_accept(server, (uv_stream_t*)client) == 0) {
            uv_read_start((uv_stream_t*)client, alloc_buffer, echo_read);
        }
        else {
            uv_close((uv_handle_t*)client, NULL);
        }
    }
    
    int main() {
        loop = uv_default_loop();
    
        uv_tcp_t server;
        uv_tcp_init(loop, &server);
    
        uv_ip4_addr("0.0.0.0", DEFAULT_PORT, &addr);
    
        uv_tcp_bind(&server, (const struct sockaddr*) & addr, 0);
        int r = uv_listen((uv_stream_t*)&server, DEFAULT_BACKLOG, on_new_connection);
        if (r) {
            fprintf(stderr, "Listen error %s
    ", uv_strerror(r));
            return 1;
        }
        return uv_run(loop, UV_RUN_DEFAULT);
    }
  • 相关阅读:
    便 加权并查集
    bzoj 4565 状压区间dp
    bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
    poj 3243 扩展BSGS
    bzoj 3239 poj 2417 BSGS
    51nod 1135 原根 就是原根...
    bzoj 2005 能量采集 莫比乌斯反演
    约会 倍增lca
    bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
    IE下textarea去除回车换行符
  • 原文地址:https://www.cnblogs.com/osbreak/p/14093118.html
Copyright © 2011-2022 走看看