记一次行情组播接收调试过程

公司对接东方证券和中泰证券的行情都是使用的盛立EFH接口,在东方证券已经部署在实盘正常使用,在中泰证券部署时发现收不到行情。

中泰证券多了个行情接入认证程序,其实怀疑是否这边有问题,但是通过

1
tcpdump -i 网口 udp

或明确指定组播来源

1
tcpdump -i 网口 host 组播IP

可以抓到组播服务器发出的数据包,说明组播到达了网口,那也说明行情接入认证是成功的。

于是深入代码调试,发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// ...
while (true) {
if (m_thrade_quit_flag) {
return NULL;
}

socklen_t len = sizeof(sockaddr_in);

// 始终返回-1
n_rcved = recvfrom(m_sock, line, RCV_BUF_SIZE, 0, (struct sockaddr*)&muticast_addr, &len);
if ( n_rcved < 0) {
// 在此处打印 errno 是 11,即 EAGAIN
continue;
}
else if (0 == n_rcved) {
continue;
}
else {
report_user(EVENT_RECEIVE, m_id, line, n_rcved);
}
}
// ...

因为m_sock被设置成了异步的,所以在没有数据时立刻返回-1,errno==EAGAIN就是正常现象。

搜索recvfrom 始终返回-1 tcpdump可以抓到包发现有人说是被防火墙拦截了。

1
2
service firewalld.service stop
systemctl disable firewalld.service

执行后果然可以收到了,说明tcpdump的处理在防火墙之前,可以抓到被防火墙拦截的数据。