在 Visual Studio 中使用 Winsock

Using Winsock in Visual Studio

我是C++小白

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

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

特别不喜欢下面这几行代码

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

Microsoft 指南没有告诉我如何修复或link我的项目的库。

如何 link 和使用 Winsock?

谢谢!

It specifically does not like the following lines of code

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

那些 headers 在 Windows 上不可用,它们仅在其他平台上使用。

How do I link and use Winsock?

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

并且你需要调用WSAStartup()WSACleanup(),这在其他平台上是不存在的。

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

当 disconnecting/freeing 套接字句柄时,您需要调用 closesocket() 而不是 close()

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

也就是说,Winsock 是一个 lower-level 网络 API,新手很难正确使用它。然后你必须在它上面添加一个 application-layer 协议,比如 HTTP,这对于菜鸟来说更难搞定。想学习新东西很好,但是在不了解基础知识的情况下直接跳入 HTTP 是灾难的根源。您最好使用 Microsoft 的 WinInet or WinHTTP API,让它为您处理所有网络和协议细节。

为了 link 您的应用成功,您可以将以下行放入 stdafx.h header:

而不是进入“选项...”
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.lib")

#pragma comment 告诉 link 用户使用您需要的 WS2_32.lib 库。