2011-06-02 106 views
0

我正在写一个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;*/ 
} 

有没有人的想法?

回答

0

可能调用了错误的约定。

在Windows上,大部分API函数被定义为WINAPI,即__stdcall,也叫做PASCAL。即从左到右传递参数,堆栈由被调用者清理。

OTOH默认编译调用约定是__cdecl

P.S.如果mingw打印出更详细的错误信息,那就好了。

+0

好的,这工作。感谢:D – 2011-06-02 16:22:49

0

如果“连接”是一个功能,您应该将其作为“连接”而不是“&连接”传递。该函数的名称已经是它的指针。

+0

好吧,我试过这个,但它创建了相同的输出。我的本地gcc编译它,但不是。 – 2011-06-02 16:16:02