函数说明
该函数用于初始化 TOA fetcher。
bool InitUpToaFetcher(char *ncard_ip_str, char *svr_ip_str, u_short svr_port[], u_short svr_port_num, u_short cache_secs=TIMER_CACHE_SECS)
入参说明
返回值
函数说明
该函数用于获取 TOA 值,tcp-syn 包交互后,最长需要等待 1ms 后可以获取到 TOA,正常情况下三次握手需要消耗1ms以上。
bool FetchToaValue(u_long fake_client_ip_addr, u_short fake_client_port, u_long &real_client_ip_addr, u_short &real_client_port)
入参说明
返回值
函数说明
该函数用于停止 TOA fetcher。
void StopToaFetcher()
入参说明
无。
返回值
无。
函数说明
该函数用于获取 Fetcher 状态。
int GetFetcherStatus()
入参说明
无。
返回值
函数说明
该函数用于获取 TOA 旁路线程句柄。
HANDLE FetchThreadHandler()
入参说明
无。
返回值
TOA 旁路线程句柄,当 ToaFetcher 实例被销毁时,将主动关闭该句柄。
函数说明
该函数用于获取错误码。
bool FetchErrorInfo(int* err_code_ptr, char* err_msg_ptr)
入参说明
返回值
错误码 | 错误信息 | 说明 |
---|---|---|
0 | Ok | 正常 |
-1001 | Exceed max server port number | 超过最大的端口数,请检查 InitUpToaFetcher:svr_port_num。 |
-1002 | Invalid IP address | 非法的 IPv4 地址。 |
-1003 | No suitable network interface | 未找到合适的网络接口。 |
-1004 | System Error: find dev error | 系统错误:未找到 dev,请联系 lib 开发者。 |
-1005 | System Error: start timer error | 系统错误:定时器启动错误,请联系 lib 开发者。 |
-1006 | System Error: compile filter error | 系统错误:过滤规则编译错误,请联系lib开发者。 |
-1007 | System Error: set filter error | 系统错误:过滤规则设置错误,请联系 lib 开发者。 |
-1008 | System Error: open pcap error | 系统错误:打开 dev 错误,请联系 lib 开发者。 |
-1009 | System Error: start pcap error | 系统错误:启动监听错误,请联系 lib 开发者。 |
-1010 | System Error: begin thread error | 系统错误:启动线程错误,请联系 lib 开发者。 |
-1999 | Unknown error | 未知错误,请联系 lib 开发者。 |
初始化 ToaFetcher:
char ncard_ip_str[] = "1.1.1.1";
char svr_ip_str[] = "1.1.1.1";
char port_range[3][100] = {"10001-10005", "20001-20005", "30001-30005"};
char* port_range_ptr[3] = {port_range[0], port_range[1], port_range[2]};
u_short svr_port_list[3] = {1111, 2222, 3333};
ToaFetcher inst = ToaFetcher();
inst.InitUpToaFetcher((char*)ncard_ip_str, (char*)svr_ip_str, svr_port_list, 3);
获取 TOA:
void GetToa(SOCKADDR_IN client_addr, ToaFetcher * toa_fetcher_ptr)
{
u_long fake_client_ip_addr = 0;
u_short fake_client_port = 0;
u_long real_client_ip_addr = 0;
u_short real_client_port = 0;
memcpy(&fake_client_ip_addr, &client_addr.sin_addr, 4);
memcpy(&fake_client_port, &client_addr.sin_port, 2);
bool ret = toa_fetcher_ptr->FetchToaValue(fake_client_ip_addr, fake_client_port, real_client_ip_addr, real_client_port);
if(ret == FALSE){
printf("No toa found\n");
}else{
//fpp: 自定义的打印函数
fpp("real_client_ip_addr", &real_client_ip_addr, 4);
fpp("real_client_port", &real_client_port, 2);
}
}
TOA 获取端通过本机 UDP 通信的方式向 toa_win.exe 获取真实 IP 地址。
| ID(4Bytes)| FakeIPAddress(4Bytes)| FakePort(2Bytes)|
字段说明如下:
ID:4字节,用于唯一标识一个请求,响应中将原始返回。
FakeIPAddrss:4字节,客户端伪 IP 地址,采用网络序存储,从服务器 accept 函数返回的对端地址中获取。
FakePort:2字节,客户端伪端口号,采用网络序存储,从服务器 accept 函数返回的对端地址中获取。
响应:| ID(4Bytes)| Code(1Byte)| RealIPAddress(4Bytes)| RealPort(2Bytes)|
字段说明如下:
详情请参见 demo.go,可以自行开发 TOA 获取客户端程序,也可以使用 demo.go 中的 queryToa 函数进行获取。
函数说明
func queryToa(serverAddr string, fakeIp string, fakePort uint16)(int32, string, uint16)
入参说明
本页内容是否解决了您的问题?