基于libuv库的tcp, udp echo服务器和客户段测试python代码。

本文提供了基于libuv库的TCP和UDP回显服务器的Python代码,并分享了TCP客户端测试用例。在实现过程中,特别提到了在处理TCP连接关闭时,未正确释放读内存导致的内存泄露问题,该问题可能导致程序崩溃。
摘要由CSDN通过智能技术生成

TCP 客户端测试python代码:

import socket
import time

def tcpClient():
    for i in range(10000):
        clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        clisock.connect(('localhost', 7890))
        clisock.send('Hi Doudou')
        dat = clisock.recv(30)
        print dat
        clisock.close()
    print "----------------11111111------------------------" 
    clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clisock.connect(('localhost', 7890))
    for i in range(100000):
        clisock.send('Hi Doudou')
        dat = clisock.recv(30)
        print dat



if __name__ ==  '__main__':
    start = time.time()
    tcpClient()
    print "total time ",  time.time() - start

UDP端测试python代码:

import socket
host = "127.0.0.1"
port = 7890

print "python UDP echo server test"

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

s.bind((host, 2346))
msg = ""
for i in range(1, 100000):
    if i % 2 == 0:
        msg = "NO:%d hello libuv udp" % i
    else:
        msg
当使用libuv时,你需要编写事件循环和处理回调函数。下面是一个简单的示例代码,展示了如何使用libuv来创建一个TCP服务器: ```c #include <stdio.h> #include <uv.h> void on_new_connection(uv_stream_t* server, int status) { if (status < 0) { fprintf(stderr, "New connection error: %s\n", uv_strerror(status)); return; } uv_tcp_t* client = (uv_tcp_t*) malloc(sizeof(uv_tcp_t)); uv_tcp_init(uv_default_loop(), client); if (uv_accept(server, (uv_stream_t*) client) == 0) { uv_read_start((uv_stream_t*) client, on_alloc_buffer, on_receive_data); } else { uv_close((uv_handle_t*) client, NULL); } } void on_alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { *buf = uv_buf_init((char*) malloc(suggested_size), suggested_size); } void on_receive_data(uv_stream_t* client, ssize_t nread, const uv_buf_t* buf) { if (nread > 0) { printf("Received data: %s\n", buf->base); } else if (nread < 0) { fprintf(stderr, "Read error: %s\n", uv_strerror(nread)); } free(buf->base); } int main() { uv_loop_t* loop = uv_default_loop(); uv_tcp_t server; uv_tcp_init(loop, &server); struct sockaddr_in addr; uv_ip4_addr("0.0.0.0", 8080, &addr); uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0); int r = uv_listen((uv_stream_t*)&server, 128, on_new_connection); if (r) { fprintf(stderr, "Listen error: %s\n", uv_strerror(r)); return 1; } return uv_run(loop, UV_RUN_DEFAULT); } ``` 这代码创建了一个TCP服务器,监听本地的8080端口。当有新的连接建立时,`on_new_connection`回调函数被调用。在回调函数中,我们初始化一个新的uv_tcp_t结构体,并通过调用`uv_accept`来接受连接。如果接受成功,我们调用`uv_read_start`来开始读取客户端发送的数据。 在`on_alloc_buffer`回调函数中,我们分配内存来存储接收到的数据。在`on_receive_data`回调函数中,我们处理接收到的数据。 最后,在主函数中,我们初始化libuv的事件循环,创建并绑定TCP服务器,开始监听连接。最后,通过调用`uv_run`来启动事件循环。 这只是一个简单的示例,libuv还提供了许多其他功能,如异步文件操作、定时器等。你可以根据具体需求使用libuv来编写更复杂的异步I/O应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值