2017-09-23 7 views
0

J'essaye de programmer un serveur simple avec winsock2. Je ne comprends pas pour compiler correctement.C winsock2.h WS2_32.lib liant undefined refernce à

#define _WIN32_WINNT 0x0501 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#include <stdio.h> 
#include <string.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include "dump.h" 

#pragma comment(lib,"WS2_32.lib") 

#define PORT 7890 

int main(void) 
{ 
    //fd --> file descriptor 
    int sockfd, new_sockfd; //warten an sockfd, neue Verbindung an new_sockfd 
    struct sockaddr_in host_addr, client_addr; //Addressinformationen 
    //sockaddr_in aus winsock.h 

    //Laenge des Inputs --> winsock Alternative suchen 
    socklen_t sin_size; 

    int recv_length = 1, yes = 1; 
    char buffer[1024]; 
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) 
     //PF_INET --> Protocol family 
     //AF_INET --> Addres family 
     printf("%s\n", "in socket"); 
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(int)) == -1) 
     printf("%s\n", "setting socket option SO_REUSEADDR"); 

    //vorbereiten auf den bind-Befehl 
    host_addr.sin_family = AF_INET; 
    host_addr.sin_port = htons(PORT); 
    //htons --> host to network short 
    //Wandelt bei 16 Bit int Hostbytereihenfolge in Netzwerkbytereihenfolge 
    host_addr.sin_addr.s_addr = 0; //Automatisch mit meiner IP fuellen 
    memset(&(host_addr.sin_zero), '\0', 8); // Rest der Struktur mit 0 fuellen 

    if (bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1) 
     printf("%s\n", "binding to socket"); 
    if (listen(sockfd, 5) == -1) 
    { 
     printf("%s\n", "listening on socket"); 
    } 

    //Schleife um am PORT zu lauschen und Verbindungen zu akzeptieren 
    while (1) 
    { 
     sin_size = sizeof(struct sockaddr_in); 
     //accept gibt neuen sockfd zurueck ! 
     new_sockfd = 

     accept(sockfd, (struct sockaddr *) &client_addr, &sin_size); 
     if (new_sockfd == -1) 
     { 
      printf("%s\n", "accepting connection"); 
     } 
     printf("server: got connection from %s port %d\n", 
       inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 
     send(new_sockfd, "Hello, world!\n", 13, 0); 
     recv_length = recv(new_sockfd, buffer, 1024, 0); 
     while (recv_length > 0) 
     { 
      printf("RECV: %d bytes \n", recv_length); 
      dump(buffer, recv_length); 
      recv_length = recv(new_sockfd, buffer, 1024, 0); 
     } 
     closesocket(new_sockfd); 
    } 
    return 0; 
} 

C'était d'abord pour Linux avec socket.h mais j'ai essayé de l'implémenter avec winsock2 sous windows7. J'ai installé manuellement le Windows SDK et trouvé la bibliothèque Ws2_32.lib que je dois lier. Je compile avec gcc (mingw32) dans CLION. J'ai mis les drapeaux de paramètre

-lws2_32 -lwsock32 

Je sais qu'il y a beaucoup de messages ici répondant à cette question mais rien ne semble fonctionner pour moi.

La sortie de CLION:

"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" --build C:\Users\Marcel\Desktop\Projekte\C-Projekte\Sequenz-Uebungen\Simple_Server\cmake-build-debug --target Simple_Server -- -j 2 
[ 50%] Linking C executable Simple_Server.exe 
CMakeFiles\Simple_Server.dir/objects.a(main.c.obj): In function `main': 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:49: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:53: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:58: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:64: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:66: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:78: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:84: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:83: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:85: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:86: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:91: undefined reference to `[email protected]' 
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:93: undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\Simple_Server.dir\build.make:95: recipe for target 'Simple_Server.exe' failed 
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Simple_Server.dir/all' failed 
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Simple_Server.dir/rule' failed 
mingw32-make.exe[3]: *** [Simple_Server.exe] Error 1 
mingw32-make.exe[2]: *** [CMakeFiles/Simple_Server.dir/all] Error 2 
mingw32-make.exe[1]: *** [CMakeFiles/Simple_Server.dir/rule] Error 2 
Makefile:117: recipe for target 'Simple_Server' failed 
mingw32-make.exe: *** [Simple_Server] Error 2 

J'ai utilisé la commande suivante maintenant pour compiler avec gcc:

gcc -Wl,-verbose -lws2_32 -lwsock32 -o simple_server main.c > linker.txt 

Il donne suite à la sortie:

================================================== 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o succeeded 
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o succeeded 
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc\libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libws2_32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../ws2_32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.a succeeded 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/wsock32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc\libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.lib failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libwsock32.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../wsock32.dll.a failed 
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.a succeeded 

et cela au début :

using internal linker script: 
================================================== 
/* Default linker script, for normal executables */ 
/* Copyright (C) 2014-2017 Free Software Foundation, Inc. 
    Copying and distribution of this script, with or without modification, 
    are permitted in any medium without royalty provided the copyright 
    notice and this notice are preserved. */ 
OUTPUT_FORMAT(pei-i386) 
SEARCH_DIR("/mingw/mingw32/lib"); SEARCH_DIR("/mingw/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); 
+0

Nous ne pouvons pas dire ce qui ne va pas avec votre commande de liaison parce que nous ne pouvons pas le voir. Remplacez la sortie de clion par la sortie verbeuse ('make VERBOSE = 1') –

+0

Comment puis-je activer le mode verbeux? – MNCODE

Répondre

1

Tout d'abord supprimer #pragma comment(lib, "WS2_32.lib") c'est seulement la directive du compilateur Visual C++. En second lieu, vous ne disposez pas de CMakeLists.txt, saviez-vous que CLion vise les solutions multiplateformes et configure les fichiers pour l'environnement spécifié (sous l'onglet toolchain) à partir de CMake. Cela signifie que vous n'avez pas besoin d'appeler gcc et les bibliothèques de liens manuellement, tout ce dont vous avez besoin est target_link_libraries(myexecutable ws2_32) après add_executable(myexecutable). Troisièmement, vous n'avez pas besoin de wsock32.lib réellement lié à votre projet, sauf si vous voulez une rétrocompatibilité avec Win95 (je suis sûr que non). Pour plus de détails, voir this answer.

Votre haut niveau fichier CMake devrait ressembler (j'ai construction réussie):

# system 
cmake_minimum_required(VERSION 3.6) 
set(CMAKE_C_STANDARD 99) 

# project 
project(WinsockExample C) 

# sources 
set(source_files 
    main.c 
    ) 

# build 
add_executable(${CMAKE_PROJECT_NAME} ${source_files}) 
target_link_libraries(${CMAKE_PROJECT_NAME} ws2_32) 
+1

Merci beaucoup, ça m'a beaucoup aidé :) – MNCODE

+0

@MNCODE heureux de vous aider. En passant, j'ai fait une petite erreur, 'add_executable()' était censé utiliser la variable 'source_files', maintenant cela corrigé :) – Liastre