Epoll 的一个巨坑!

    xiaoxiao2026-04-15  2

    多年前就用过epoll写socket服务,最终写出来的东西不稳定,即便用了libevent也同样会出现运行 不定时间之后出现能连接,但是服务器端毫无反应,客户端也不显示连接上,也不出现连接失败的一种情况。

    今天由于需要想写个socket转发服务,再次拿起当年写的代码。

    当一个人连接之后,我立即开一个线程,链接到转发服务器,然后把跟服务器的连接fd,和客户端的fd保存到一个struct,然后把这个传给event.data.ptr。

    坑来了,event.data是个union,

    如果这样写

    event.data.ptr=&struct_data;

    event.data.fd=client_fd;

    在客户端有数据上来时,你读取不到event.data.ptr,因为

    event.data.fd=client_fd;会覆盖event.data.ptr=&struct_data;。Unoin就是这样子的。

    所以,只写,event.data.ptr=&struct_data;而client_fd保存到struct中

    ------------------

    补充一个C语言的错误认识

    int i;

    typedef struct{  int server_sock;     int client_sock;  int fd; } final_client_data;

    for(i=0;i<10;i++){

         final_client_data a;

         printf("%a\n", &a);

    }

    结果:

    [root@server-164 proxy]# ./proxy 127.0.0.1 1234 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890 0x7fffa5204890

    哭瞎了,,,,,

     
    转载请注明原文地址: https://ju.6miu.com/read-1308862.html
    最新回复(0)