在 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.h
或winsock2.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 库。
我是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.h
或winsock2.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 库。