c - 函数参数无效

标签 c sockets function-pointers

我正在编写一个使用套接字的 C 代码。我在Windows和Linux上使用这个,所以我尝试动态地编写它。我编写了两个函数来获取服务器/客户端套接字。我在编译时遇到错误:

debian:~/cross_socket# make
gcc *.c -Wall
i586-mingw32msvc-gcc *.c -Wall -lws2_32
socket.c: In function 'get_client_socket':
socket.c:28: warning: passing argument 3 of 'get_socket' from incompatible pointer type
socket.c:13: note: expected 'int (*)(SOCKET,  const struct sockaddr *, int)' but argument is of type 'int (*)(SOCKET,  const struct sockaddr *, int)'
socket.c: In function 'get_server_socket_addr':
socket.c:43: warning: passing argument 3 of 'get_socket' from incompatible pointer type
socket.c:13: note: expected 'int (*)(SOCKET,  const struct sockaddr *, int)' but argument is of type 'int (*)(SOCKET,  const struct sockaddr *, int)'

gcc 在我的本地系统上工作得很好,但是如果我使用 mingw,我会收到此错误?!? 它说: 我使用 int (*)(SOCKET, const struct sockaddr *, int) 而不是 int (*)(SOCKET, const struct sockaddr *, int)...?

相关代码如下:

inline SOCKET get_socket(uint16_t port, in_addr_t socket_in_addr, int (*create)(SOCKET, 
const struct sockaddr*, socklen_t)) {
        SOCKADDR_IN addr;
        SOCKET result_socket = GET_SOCKET;
        if (SOCKET_NOK(result_socket))
                return SOCKET_INIT_ERROR;
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = socket_in_addr;
        if (CONNECT_NOK(create(result_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR))))
                return SOCKET_INIT_ERROR;
        return result_socket;
}

SOCKET get_client_socket(char* target, uint16_t port) {
        return get_socket(port, inet_addr(target), &connect);
/*      SOCKADDR_IN addr;
        SOCKET client_socket = GET_SOCKET;
        if (SOCKET_NOK(client_socket))
                return SOCKET_INIT_ERROR;
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = inet_addr(target);
        if (CONNECT_NOK(connect(client_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR))))
                return SOCKET_INIT_ERROR;
        return client_socket;*/
}

SOCKET get_server_socket_addr(uint16_t port, in_addr_t socket_in_addr) {
        return get_socket(port, socket_in_addr, &bind);
/*      SOCKADDR_IN addr;
        SOCKET server_socket = GET_SOCKET;
        if (SOCKET_NOK(server_socket))
                return SOCKET_INIT_ERROR;
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = socket_in_addr;
        if (CONNECT_NOK(bind(server_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN))))
                return SOCKET_INIT_ERROR;
        return server_socket;*/
}

有人有想法吗?

最佳答案

可能调用了错误的约定。

在 Windows 上,大多数 API 函数都定义为 WINAPI,即 __stdcall,又名 PASCAL。即参数从左到右传递,并且堆栈由被调用者清理。

OTOH默认编译调用约定是__cdecl

附注如果mingw能打印更详细的错误信息就好了。

关于c - 函数参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217121/

相关文章:

c++ - 禁止使用 __sprintf_chk()

c - 为结构变量定义字符串值

sockets - 每个人都必须同意 SO_REUSEADDR 吗?

c++ - 在 C++11 中将 std::function/mem_fn 与成员函数一起使用

c++ - 为什么while循环会导致指针出现问题?

将 C 中的迭代算法更改为递归

c - openmp 代码执行期间的 "cygwin_exception::open_stackdumpfile error"

c++ - 如何解决 WSAEWOULDBLOCK 错误

java - 如何使用同一个Socket来多个InputStreamReader和OutputStreamWriter

c++ - tolower 发生了什么事?