c - 使用 LD_PRELOAD 覆盖连接调用

标签 c sockets pointers network-programming overriding

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

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

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

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 * 有任何提示吗?

谢谢!

最佳答案

无法重现:

#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]

关于c - 使用 LD_PRELOAD 覆盖连接调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19314842/

相关文章:

c - Mac OS X 上的 Valgrind 错误 printf a double

sockets - 一个系统(计算机)可以处理多少个 TCP/IP 套接字连接?

c++ - 指针对齐

Python 套接字只允许一个连接,但在新连接时断开连接,而不是拒绝

无法使用 C 中的套接字下载多个文件

c - 指针的指针作为函数参数

c - 当用 %d 打印 int 指针时打印出什么?

c - "fork()"后printf异常

c++ - 如何从单独的 .cpp 文件调用函数?

c - 如何将表存储到链表中?