2010-12-08 5 views
0

Nouveau à C++ express, et après suivre le tutoriel de Winsock, obtenant d'innombrables d'erreur. Liez déjà l'inclusion de Windows SDK 7.1 aux propriétés. Qu'est-ce que je rate?erreur tutoriel Winsock

#include <winsock2.h> 
#include <stdio.h> 
#include <stdafx.h> 

#pragma comment(lib, "Ws2_32.lib") 
#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

int main(int argc, char **argv) 
{ 
    WSADATA wsaData; 

    SOCKET SendingSocket; 

    // Server/receiver address 

    SOCKADDR_IN   ServerAddr, ThisSenderInfo; 

    // Server/receiver port to connect to 

    unsigned int   Port = 7171; 

    int RetCode; 

    // Be careful with the array bound, provide some checking mechanism... 

    char sendbuf[1024] = "This is a test string from sender"; 

    int BytesSent, nlen; 



    // Initialize Winsock version 2.2 

    WSAStartup(MAKEWORD(2,2), &wsaData); 

    printf("Client: Winsock DLL status is %s.\n", wsaData.szSystemStatus); 



    // Create a new socket to make a client connection. 

    // AF_INET = 2, The Internet Protocol version 4 (IPv4) address family, TCP protocol 

    SendingSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if(SendingSocket == INVALID_SOCKET) 

    { 

      printf("Client: socket() failed! Error code: %ld\n", WSAGetLastError()); 

      // Do the clean up 

      WSACleanup(); 

      // Exit with error 

      return -1; 

    } 

    else 

      printf("Client: socket() is OK!\n"); 



    // Set up a SOCKADDR_IN structure that will be used to connect 

    // to a listening server on port 5150. For demonstration 

    // purposes, let's assume our server's IP address is 127.0.0.1 or localhost 



    // IPv4 

    ServerAddr.sin_family = AF_INET; 

    // Port no. 

    ServerAddr.sin_port = htons(Port); 

    // The IP address 

    ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 



    // Make a connection to the server with socket SendingSocket. 

    RetCode = connect(SendingSocket, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)); 

    if(RetCode != 0) 

    { 

      printf("Client: connect() failed! Error code: %ld\n", WSAGetLastError()); 

      // Close the socket 

      closesocket(SendingSocket); 

      // Do the clean up 

      WSACleanup(); 

      // Exit with error 

      return -1; 

    } 

    else 

    { 

      printf("Client: connect() is OK, got connected...\n"); 

      printf("Client: Ready for sending and/or receiving data...\n"); 

    } 



    // At this point you can start sending or receiving data on 

    // the socket SendingSocket. 



    // Some info on the receiver side... 

    getsockname(SendingSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr)); 

    printf("Client: Receiver IP(s) used: %s\n", inet_ntoa(ServerAddr.sin_addr)); 

    printf("Client: Receiver port used: %d\n", htons(ServerAddr.sin_port)); 



    // Sends some data to server/receiver... 

    BytesSent = send(SendingSocket, sendbuf, strlen(sendbuf), 0); 



    if(BytesSent == SOCKET_ERROR) 

      printf("Client: send() error %ld.\n", WSAGetLastError()); 

    else 

    { 

      printf("Client: send() is OK - bytes sent: %ld\n", BytesSent); 

      // Some info on this sender side... 

      // Allocate the required resources 

      memset(&ThisSenderInfo, 0, sizeof(ThisSenderInfo)); 

      nlen = sizeof(ThisSenderInfo); 



      getsockname(SendingSocket, (SOCKADDR *)&ThisSenderInfo, &nlen); 

      printf("Client: Sender IP(s) used: %s\n", inet_ntoa(ThisSenderInfo.sin_addr)); 

      printf("Client: Sender port used: %d\n", htons(ThisSenderInfo.sin_port)); 

      printf("Client: Those bytes represent: \"%s\"\n", sendbuf); 

    } 



    if(shutdown(SendingSocket, SD_SEND) != 0) 

      printf("Client: Well, there is something wrong with the shutdown(). 

        The error code: %ld\n", WSAGetLastError()); 

    else 

      printf("Client: shutdown() looks OK...\n"); 

    // When you are finished sending and receiving data on socket SendingSocket, 

    // you should close the socket using the closesocket API. We will 

    // describe socket closure later in the chapter. 

    if(closesocket(SendingSocket) != 0) 

      printf("Client: Cannot close \"SendingSocket\" socket. Error code: %ld\n", WSAGetLastError()); 

    else 

      printf("Client: Closing \"SendingSocket\" socket...\n"); 



    // When your application is finished handling the connection, call WSACleanup. 

    if(WSACleanup() != 0) 

      printf("Client: WSACleanup() failed!...\n"); 

    else 

      printf("Client: WSACleanup() is OK...\n"); 

    return 0; 

} 

journal d'erreur:

1>------ Build started: Project: ws, Configuration: Debug Win32 ------ 
1>Compiling... 
1>ws.cpp 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(1) : warning C4627: '#include <winsock2.h>': skipped when looking for precompiled header use 
1>  Add directive to 'stdafx.h' or rebuild precompiled header 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(7) : error C2065: 'WSADATA' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(7) : error C2146: syntax error : missing ';' before identifier 'wsaData' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(7) : error C2065: 'wsaData' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(9) : error C2065: 'SOCKET' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(9) : error C2146: syntax error : missing ';' before identifier 'SendingSocket' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(9) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(13) : error C2065: 'SOCKADDR_IN' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(13) : error C2146: syntax error : missing ';' before identifier 'ServerAddr' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(13) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(13) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(31) : error C2065: 'wsaData' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(31) : error C3861: 'WSAStartup': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(31) : error C3861: 'MAKEWORD': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(33) : error C2065: 'wsaData' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(33) : error C2228: left of '.szSystemStatus' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(41) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(41) : error C2065: 'AF_INET' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(41) : error C2065: 'SOCK_STREAM' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(41) : error C2065: 'IPPROTO_TCP' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(41) : error C3861: 'socket': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(43) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(43) : error C2065: 'INVALID_SOCKET' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(47) : error C3861: 'WSAGetLastError': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(51) : error C3861: 'WSACleanup': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(75) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(75) : error C2228: left of '.sin_family' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(75) : error C2065: 'AF_INET' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(79) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(79) : error C2228: left of '.sin_port' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(79) : error C3861: 'htons': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(83) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(83) : error C2228: left of '.sin_addr' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(83) : error C2228: left of '.s_addr' must have class/struct/union 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(83) : error C3861: 'inet_addr': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(89) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(89) : error C2065: 'SOCKADDR' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(89) : error C2059: syntax error : ')' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(89) : error C3861: 'connect': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(95) : error C3861: 'WSAGetLastError': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(99) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(99) : error C3861: 'closesocket': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(103) : error C3861: 'WSACleanup': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(131) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(131) : error C2065: 'SOCKADDR' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(131) : error C2059: syntax error : ')' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(133) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(133) : error C2228: left of '.sin_addr' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(131) : error C3861: 'getsockname': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(133) : error C3861: 'inet_ntoa': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(135) : error C2065: 'ServerAddr' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(135) : error C2228: left of '.sin_port' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(135) : error C3861: 'htons': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(141) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(141) : error C3861: 'send': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(141) : error C3861: 'strlen': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(145) : error C2065: 'SOCKET_ERROR' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(147) : error C3861: 'WSAGetLastError': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(159) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(159) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(159) : error C2070: ''unknown-type'': illegal sizeof operand 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(159) : error C3861: 'memset': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(161) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(161) : error C2070: ''unknown-type'': illegal sizeof operand 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(165) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(165) : error C2065: 'SOCKADDR' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(165) : error C2059: syntax error : ')' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(167) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(167) : error C2228: left of '.sin_addr' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(165) : error C3861: 'getsockname': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(167) : error C3861: 'inet_ntoa': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(169) : error C2065: 'ThisSenderInfo' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(169) : error C2228: left of '.sin_port' must have class/struct/union 
1>  type is ''unknown-type'' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(169) : error C3861: 'htons': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(177) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(177) : error C2065: 'SD_SEND' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(177) : error C3861: 'shutdown': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(179) : error C2001: newline in constant 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(181) : error C2146: syntax error : missing ')' before identifier 'The' 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(181) : error C2017: illegal escape sequence 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(181) : error C2001: newline in constant 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(193) : error C2065: 'SendingSocket' : undeclared identifier 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(193) : error C3861: 'closesocket': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(195) : error C3861: 'WSAGetLastError': identifier not found 
1>c:\users\wildfire\documents\visual studio 2008\projects\ws\ws\ws.cpp(205) : error C3861: 'WSACleanup': identifier not found 
1>Build log was saved at "file://c:\Users\Wildfire\Documents\Visual Studio 2008\Projects\ws\ws\Debug\BuildLog.htm" 
1>ws - 84 error(s), 1 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Eh bien, la première ligne de votre erreur signifie que winsock n'est même pas inclus. Fixez cela et vous pouvez partir de là. En règle générale, ne prenez pas la peine de regarder les erreurs secondaires d'une compilation C/C++ - elles sont généralement liées à la première. – Robert

+0

@Robert: les erreurs secondaires dans le compilateur peuvent très bien être liées à quelque chose de complètement différent. Sinon, le compilateur arrêterait de compiler après la première erreur, non? Quel est le point à afficher toutes les erreurs si vous êtes seulement censé regarder le premier? – Default

+0

@Default - oui, bien sûr, je ne le pensais pas comme ça. Mais votre code ne compile pas, et fréquemment (je dirais plus souvent qu'autrement) c'est à cause de vos erreurs précédentes. C'est pire en C/C++ que Java, par exemple. Fondamentalement, le compilateur vous donnera toutes sortes d'erreurs étranges et confuses si vous faites quelque chose comme oublier une fermeture}, et vous devez corriger la première erreur de toute façon. – Robert

Répondre

4

Déplacer #include "stdafx.h" vers le haut. Il ne parvient pas à trouver le fichier d'en-tête précompilé stdafx.h. C'est la première erreur. Lorsque vous utilisez des en-têtes précompilés, le fichier d'en-tête que vous précompilez (dans ce cas, stdafx.h) doit toujours être la première ligne du fichier (les commentaires sont ok).

De plus, cette

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

devrait aller avant l'inclusion winsock2.h. Cela indique au compilateur de ne pas inclure trop de fichiers Windows SDK pour accélérer la compilation. Mettre ceci après #include <winsock2.h> n'a aucun effet.

+0

Je vois! Tout fonctionne avec une erreur fixée dans le code. – Proyb2

+0

S'il a répondu à votre question, vous pouvez cliquer sur la coche pour l'accepter. – Robert