【问题标题】:Using Winsock in Visual Studio在 Visual Studio 中使用 Winsock
【发布时间】:2015-10-30 17:48:13
【问题描述】:

我是 C++ 菜鸟。

我想使用 Winsock 向 IP 地址发送 HTTP 请求。我在网上找到了很多内容,非常棒。所有示例都有相同的错误,我意识到它们都需要 Winsock。

我从未使用过 C++ 库,我不知道什么或如何将任何东西链接到我的项目(在 Visual Studio 中),或者我需要下载什么。

具体不喜欢下面这几行代码

#include<sys/socket.h>    //socket
#include<arpa/inet.h> //inet_addr
#include<netdb.h> //hostent

Microsoft 指南没有告诉我如何修复库或将库链接到我的项目。

如何链接和使用 Winsock?

谢谢!

【问题讨论】:

  • this 有什么问题?你能问一个在容易找到的网页上没有回答的具体问题吗?
  • 要求操作系统网络堆栈不是错误:)
  • 幸福的三个步骤: 1. 在 MSDN 上找到所需函数的文档。 2. 向下滚动以找出要包含的标题。 3. 在它旁边,找到要链接的库。使用这三个步骤也适用于 WinSock。请注意,WinSock 和 Berkeley Socket API 有很大的重叠,但它们仍然明显不同。我还建议您不要使用低级套接字,而是使用类似的东西,例如ZeroMQ 甚至更抽象的类似 RPC 的网络层。这些最初设置起来有点复杂,但值得。
  • 您要查找的大部分内容都在 winsock2.h 或 ws2tcpip.h 中。包括他们。请记住链接 ws2_32.lib,不要期望为 Linux 编写的程序可以在 Linux 以外的任何地方编译和运行。此外,read up on WSAStartupalso on WSACleanup 两者都需要。
  • 我建议使用 boost 库中的套接字。他们工作的不仅仅是 Windows。您不必每天两次学习如何使用套接字,而需要切换到新平台。

标签: c++ visual-studio visual-studio-2015 winsock


【解决方案1】:

要成功链接您的应用,您可以将以下几行放入您的 stdafx.h 标头中,而不是转到“选项...”:

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.lib")

#pragma comment 告诉链接器使用您需要的 WS2_32.lib 库。

【讨论】:

  • 这看起来像是对我的回答,没有理由成为评论。
  • @Brian Ray 因为我回答的问题在 cmets 中。但是,如果您愿意,可以为我的答案投票,这样我就可以赚取积分并发表评论:)
【解决方案2】:

具体不喜欢下面这几行代码

#include<sys/socket.h>    //socket
#include<arpa/inet.h> //inet_addr
#include<netdb.h> //hostent

这些标头在 Windows 上不可用,它们仅在其他平台上使用。

如何链接和使用 Winsock?

在 Windows 上,您需要在代码中使用 winsock.hwinsock2.h,并链接到 ws2_32.lib

并且需要调用WSAStartup()WSACleanup(),其他平台不存在。

并且您需要使用SOCKET 而不是int 用于套接字句柄。在 Windows 上,套接字是真正的内核对象。在其他平台上,它们表示为文件描述符。

并且在断开/释放套接字句柄时,您需要调用closesocket() 而不是close()

除此之外,大多数其他基于 BSD 的套接字 API 函数调用(socket()bind()connect()recv()send()select() 等)在 Windows 中的工作方式与在其他平台(好吧,select() 有一个细微差别 - 第一个参数被忽略)。而且,当然,WinSock 有许多其他平台没有的特定于 Windows 的扩展。但如果您尝试使用您在网上找到的其他人的代码,则很可能只是使用了与 BSD 兼容的功能。

话虽如此,Winsock 是一个较低级别的网络 API,对于新手来说很难正确使用。然后你必须在上面添加一个应用层协议,比如 HTTP,这对于菜鸟来说更难做对。想要学习新东西固然很棒,但是在不了解基础知识的情况下直接跳入 HTTP 是灾难的根源。你最好使用微软的WinInetWinHTTP API,让它为你处理所有的网络和协议细节。

【讨论】:

  • 非常感谢,但有一个问题,我该如何link to ws2_32.lib
  • 阅读 Visual Studio 文档:.Lib Files as Linker Input
  • 感谢您帮我解决问题,但最后一件事(这听起来很愚蠢,因为它是),我从哪里得到 ws2_32.lib 我找不到下载链接...我会标记回答为接受。
  • 它应该包含在 Visual Studio 中。不需要指定完整路径,只需将ws2_32.lib自己添加到链接器的Additional Dependencies列表中,让链接器在编译的时候自己算出来。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2015-08-08
相关资源
最近更新 更多