2011-06-02 6 views
0

Je ne suis pas l'écriture d'un Code-C dans laquelle i utiliser des sockets. Je l'utilise sur Windows et Linux, donc j'essaie de l'écrire de façon dynamique. J'ai écrit deux fonctions pour obtenir un serveur/client-socket. Là, j'ai une erreur sur la compilation:paramètre de fonction non valide

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 pour mon système local fonctionne très bien, mais si je l'utilise MinGW je reçois cette erreur?!? Il dit: J'utilise int (*)(SOCKET, const struct sockaddr *, int) au lieu de int (*)(SOCKET, const struct sockaddr *, int) ...?

Voici le code correspondant:

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;*/ 
} 

Quelqu'un at-il une idée?

Répondre

0

probablement appeler mauvaise convention. Sur Windows, la plupart des fonctions API sont définies comme suit: WINAPI, __stdcall, par exemple PASCAL. à savoir les paramètres sont transmis de gauche à droite, et la pile est nettoyée par l'appelé.

La convention d'appel de compilation par défaut OTOH est __cdecl.

P.S. Ce serait bien si Mingw a imprimé une information d'erreur plus détaillée.

+0

Ok, cela a fonctionné. Merci: D –

0

Si « se connecter » est une fonction, vous devez simplement passer comme « connecter », et non « & connexion ». Le nom de la fonction est déjà un pointeur.

+0

Ok j'ai essayé, mais il crée la même sortie. Mon gcc local le compile, mais ne le fait pas. –

Questions connexes