首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winsock教程错误

Winsock教程错误
EN

Stack Overflow用户
提问于 2010-12-08 16:21:08
回答 2查看 12K关注 0票数 1

C++ express新手,在遵循winsock教程之后,遇到了无数的错误。已将include Windows SDK 7.1链接到属性。我遗漏了什么?

代码语言:javascript
复制
#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;

}

错误日志:

代码语言:javascript
复制
    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 ==========
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-08 16:26:07

#include "stdafx.h"移到顶部。找不到预编译头文件stdafx.h。这是第一个错误。

使用预编译头文件时,预编译头文件(在本例中为stdafx.h)应始终位于文件的第一行(注释也可以)。

还有这个

代码语言:javascript
复制
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

应该放在包含winsock2.h之前。这告诉编译器不要包含太多的Windows SDK文件来加快编译速度。将其放在#include <winsock2.h>之后没有任何效果。

票数 5
EN

Stack Overflow用户

发布于 2020-06-06 08:05:16

对我来说,解决方案是在包含windows和WSA头文件后定义指令WIN32_LEAN_AND_MEAN,如下所示:

代码语言:javascript
复制
#include <Windows.h>
#include <Winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#define WIN32_LEAN_AND_MEAN

希望这对某些人有帮助。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4385418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档