iqiyi / dpvs

DPVS is a high performance Layer-4 load balancer based on DPDK.
Other
3k stars 723 forks source link

使用UOA模块,参考example里面udp_serv.c 用Python语言获取客户端IP失败 #753

Open qazzsq101 opened 3 years ago

qazzsq101 commented 3 years ago

背景: 1、计划使用Dpvs + FullNat + UOA + Coredns组合 用于做DNS的负载均衡,期望使用UOA模块获取客户端真实IP地址。

现状: 1、编译示例 udp_serv.c获取客户端真实IP全程完全没有问题,为实现示例程序用Python尝试重写了Demo(忽略没有定义结构体等) 在使用 getsockopt(socket.IPPROTO_IP,UOA_SO_GET_LOOKUP) 报错,不执行getsockopt不会抛异常可以照常执行,只是获取不到客户端真实IP地址。

异常堆栈 Traceback (most recent call last): File "./test.py", line 19, in state = s.getsockopt(socket.IPPROTO_IP,UOA_SO_GET_LOOKUP) File "/usr/lib64/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 22] Invalid argument

程序代码如下:

!/usr/bin/python

import socket Host = '0.0.0.0' Port = 53 bufferSize = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind((Host, Port))

print("UDP server up and listening")

UOA_SO_GET_LOOKUP = 2048

while(True):

bytesAddressPair = s.recvfrom(bufferSize)

state = s.getsockopt(socket.IPPROTO_IP,UOA_SO_GET_LOOKUP)
print("state=",state)

message = bytesAddressPair[0]

address = bytesAddressPair[1]

clientMsg = "Message from Client:{}".format(message)
clientIP  = "Client IP Address:{}".format(address)

print(clientMsg)
print(clientIP)

因为Python没有指针,如getsockopt函数只有socket.getsockopt(level, optname[, buflen]) https://docs.python.org/3/library/socket.html

请大佬指教下应该如何修改才能获取客户端真实IP,万分感谢。

van-scott commented 2 years ago

您好,您后来解决了这个问题吗?我们用go语言也获取不到客户端的真实IP

ywc689 commented 2 months ago

您好,您后来解决了这个问题吗?我们用go语言也获取不到客户端的真实IP

Go参考: https://github.com/iqiyi/dpvs/blob/devel/test/quic/pkg/uoa/uoa.go