2013-03-18 3 views
0

J'ai créé le serveur de socket suivant en C (Windows) en utilisant la bibliothèque Winsock.Erreur C: référence non définie à

#undef UNICODE 

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 
#include <stdlib.h> 

// Need to link with Ws2_32.lib 
#pragma comment(lib, "WS2_32.lib") 

#define DEFAULT_PORT "27015" 
#define DEFAULT_BUFLEN 512 

int __cdecl main(void) { 

WSADATA wsaData; 
int iResult; 

SOCKET ListenSocket = INVALID_SOCKET; 
SOCKET ClientSocket = INVALID_SOCKET; 

struct addrinfo *result = NULL; 
struct addrinfo hints; 

char recvbuf[DEFAULT_BUFLEN]; 
int iSendResult; 
int recvbuflen = DEFAULT_BUFLEN; 

// Initialize Winsock 
iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
if(iResult != 0) { 
    printf("WSAStartup failed: %d\n", iResult); 
    return 1; 
} 

ZeroMemory(&hints, sizeof(hints)); 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_protocol = IPPROTO_TCP; 
hints.ai_flags = AI_PASSIVE; 

// Resolve the local address and port to be used by the server 
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); 
if(iResult != 0) { 
    printf("getaddrinfo failed: %d\n", iResult); 
    WSACleanup(); 
    return 1; 
} 

// Create a SOCKET for the server to listen for client connections 
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); 
if(ListenSocket == INVALID_SOCKET) { 
    printf("Error at socket(): %ld\n", WSAGetLastError()); 
    freeaddrinfo(result); 
    WSACleanup(); 
    return 1; 
} 

// Set up a TCP listening socket 
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); 
if (iResult == SOCKET_ERROR) { 
    printf("bind failed with error: %d\n", WSAGetLastError()); 
    freeaddrinfo(result); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 
freeaddrinfo(result), // to free the memory allocated by getaddrinfo function 

// Listen on a socket 
iResult = listen(ListenSocket, SOMAXCONN); 
if(iResult == SOCKET_ERROR) { // SOMAXCONN indicates the backlog value, maximum length of the queue of pending connections to accept 
    printf("Listen failed with error: %d\n", WSAGetLastError()); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 

// Accept connection on a socket 
ClientSocket = accept(ListenSocket, NULL, NULL); 
if(ClientSocket == INVALID_SOCKET) { 
    printf("accept failed: %d\n", WSAGetLastError()); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 
closesocket(ListenSocket); // No longer need server socket 

// Receive until the peer shuts down the connection 
do { 
    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); 
    if(iResult > 0) { 
     printf("Bytes received: %d\n", iResult); 

     // Echo buffer back to the sender 
     iSendResult = send(ClientSocket, recvbuf, iResult, 0); 
     if(iSendResult == SOCKET_ERROR) { 
      printf("send failed: %d\n", WSAGetLastError()); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return 1; 
     } 
     printf("Bytes sent: %d\n", iSendResult); 
    } else if(iResult == 0) { 
     printf("Connection closing...\n"); 
    } else { 
     printf("recv failed: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 
} while(iResult > 0); 

// Shutdown the send half of the connection since no more data will be sent 
iResult = shutdown(ClientSocket, SD_SEND); 
if(iResult == SOCKET_ERROR) { 
    printf("shutdown failed: %d\n", WSAGetLastError()); 
    closessocket(ClientSocket); 
    WSACleanup(); 
    return 1; 
} 

//cleanup 
closesocket(ClientSocket); 
WSACleanup(); 

return 0; 
} 

Et quand je tente de compiler je reçois l'erreur suivante pour toutes les fonctions de la bibliothèque Winsock:

C:\Users\Victor\AppData\Local\Temp\ccOwFjRF.o:socketServer.c:(.text+0x4a): undef 
ined reference to `[email protected]' 

J'ai ajouté le répertoire dans lequel la bibliothèque Winsock est le chemin, mais il semble que J'ai besoin de faire autre chose. Est-ce que quelqu'un a une idée du problème? Merci.

+0

Cette erreur se produit-elle au moment de la liaison ou de la compilation? Cela ressemble à l'une des deux choses. Soit vous devez inclure un autre fichier, soit vous n'êtes pas lié à une bibliothèque requise. Je crois que vous rencontrez une erreur de lien, et vous devriez vérifier ces pragmas. #pragma comment (lib, "Ws2_32.lib") #pragma comment (lib, "Mswsock.lib") #pragma comment (lib, "AdvApi32.lib") – octopusgrabbus

+0

Quelle est votre commande de construction? – Mike

+0

C'est une erreur de lien. J'ai déjà vérifié avec toutes ces pragmas mais j'ai la même erreur. – vicesbur

Répondre

2

Afin d'obtenir la compilation réussie, vous auriez besoin d'effectuer les modifications suivantes:

  1. Dans votre fichier source, vous devez définir #define _WIN32_WINNT 0x0501 avant l'inclusion des en-têtes. Reportez-vous à ce code post pour plus de détails.

  2. Il y a une faute de frappe dans les sources. Veuillez remplacer closessocket par closesocket à la ligne no. 121 de votre fichier source.

  3. Compile avec la commande suivante

    gcc -o socketServer socketServer.c -lws2_32 -lwsock32 -L $MinGW\lib

$MinGW est le répertoire d'installation de MinGW softare

Avec ces changements, je suis en mesure de compiler votre code avec succès.

+0

Merci beaucoup pour votre information. Cela m'a beaucoup aidé et mon programme fonctionne maintenant. – vicesbur