多年前就用过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
哭瞎了,,,,,