使用LD_PRELOAD覆盖连接调用

时间:2013-10-11 09:33:58

标签: c sockets pointers network-programming override

我使用以下connect()电话连接到远程主机:

result = connect(sockfd, (struct sockaddr *)&address, len);

其中地址代表sockaddr_in结构,为sockaddr *执行而转换为connect()。但是,使用库注入我可以通过定义自己的连接函数来覆盖连接调用:

int connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len)
{
   // My code in between
}

但是我无法将第二个参数(__CONST_SOCAKADDR_ARG)强制转换为sockaddr_in指针或sockaddr__CONST_SOCKADDR_ARG宏扩展为const struct sockaddr *。以下一行:

struct sockaddr_in* providedIPv4AddressStructure = (struct sockaddr_in*) addr;

让我看到以下错误指示:

error: cannot convert to a pointer type

当然:

warning: initialization from incompatible pointer type [enabled by default]

任何人都有关于如何正确地将__CONST_SOCAKADDR_ARG投射到sockaddr_in *的任何提示?

谢谢!

1 个答案:

答案 0 :(得分:1)

无法重现:

#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main() {
    __CONST_SOCKADDR_ARG p;
    struct sockaddr_in *q;

    q = (struct sockaddr_in *) p;
}

没有错误,只有来自未使用变量的警告:

$ gcc -std=c11 -Wall -pedantic test.c
test.c: In function ‘main’:
test.c:7:25: warning: variable ‘q’ set but not used [-Wunused-but-set-variable]
test.c:9:7: warning: ‘p’ is used uninitialized in this function [-Wuninitialized]