Winsock教程错误

时间:2010-12-08 08:21:08

标签: c++ c

C ++ express的新手,在关注winsock教程之后,得到了无数的错误。 已将包含Windows SDK 7.1的链接链接到属性。我错过了什么?

#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;

}

错误日志:

    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 ==========

2 个答案:

答案 0 :(得分:5)

#include "stdafx.h"移至顶部。它无法找到预编译的头文件stdafx.h。它的 第一个错误。

当您使用预编译头文件时,您预编译它们的头文件(在本例中为stdafx.h)应始终位于文件的第一行(注释正常)。

也是这个

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

应该在winsock2.h包含之前。这告诉编译器不要包含太多Windows SDK文件来加速编译。在#include <winsock2.h>之后放置此内容无效。

答案 1 :(得分:0)

对我来说,解决方案是在包括Windows和WSA标头之后定义指令WIN32_LEAN_AND_MEAN,如下所示:

#include <Windows.h>
#include <Winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#define WIN32_LEAN_AND_MEAN

希望这可以帮助某人。 :)