C 在通过LD_预加载插入JVM时卡在关闭套接字上

C 在通过LD_预加载插入JVM时卡在关闭套接字上,c,sockets,C,Sockets,我通过LD_PRELOAD变量插入JVM 基本上,我想构建一个虚拟路由表VRT。在bind调用中,我将IP地址和端口参数修改为我的选择,并保存在VRT中。此外,我还添加了套接字描述符第一个参数以绑定到链接列表。在此阶段之前,socket具有一个sin_族类型的AF_INET6 现在,当套接字关闭时,我想删除虚拟路由表条目。因此,我检查我们试图关闭的套接字描述符是否存储在链接列表中。如果是,则意味着它的记录存在于VRT中,因此我应该在关闭套接字之前删除VRT条目。我面临的问题是,在这个阶段,同一个

我通过LD_PRELOAD变量插入JVM

基本上,我想构建一个虚拟路由表VRT。在bind调用中,我将IP地址和端口参数修改为我的选择,并保存在VRT中。此外,我还添加了套接字描述符第一个参数以绑定到链接列表。在此阶段之前,socket具有一个sin_族类型的AF_INET6

现在,当套接字关闭时,我想删除虚拟路由表条目。因此,我检查我们试图关闭的套接字描述符是否存储在链接列表中。如果是,则意味着它的记录存在于VRT中,因此我应该在关闭套接字之前删除VRT条目。我面临的问题是,在这个阶段,同一个套接字描述符的sin_族值为1,我不知道它代表什么,而不是绑定期间的10 AF_INET6值。此外,我在这个阶段尝试打印套接字描述符的IP地址和端口,但这是垃圾

我不知道我错过了什么

更新: 我的代码没有问题。出现这种异常是因为我通过strace跟踪到JVM的以下行为

9722  socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 12
...(receive messages)...
9722  dup2(11, 12)                      = 12 (?!?)
9722  close(12)                         = 0
JVM在我们的套接字上复制另一个文件描述符,因此它的sin_族在关闭时不能正确显示。奇怪

sinu family==1是AF_UNIX,即管道或域名套接字

您确定它确实是同一个套接字描述符吗?但你如何识别它?它的整数值仅对进程唯一

如果您的LD_预加载过程将分叉出子对象,那么他们也将使用您的挂钩,使用与父对象相同的描述符集,以及他们的所有兄弟姐妹和子对象

因此,为了解决这种模糊性,在挂钩绑定代码中使用getpid获取PID,并将PID添加到存储此套接字的密钥中


dup2int fdOld、int fdNew在将fdNew制作为fdOld的副本之前关闭fdNew。但是你不能挂断电话来结束它,我想:-.

@AhmedJolani冷静下来,伙计…,保持礼貌是个好主意,大多数情况下,这是有帮助的。只是出于好奇:是否也钩住了shutdown?@alk这个问题很模糊,仅此而已。因此,您还需要钩住dup*也。跟踪说明了文件描述符11的来源是什么?目前,我使用的是一个简单的Java程序,它不会分叉子对象。