gpt4 book ai didi

C89:Windows 上的 getaddrinfo()?

转载 作者:可可西里 更新时间:2023-11-01 14:47:12 25 4
gpt4 key购买 nike

我是 C89 的新手,正在尝试进行一些套接字编程:

void get(char *url) {
struct addrinfo *result;
char *hostname;
int error;

hostname = getHostname(url);

error = getaddrinfo(hostname, NULL, NULL, &result);

}

我正在 Windows 上开发。如果我使用这些包含语句,Visual Studio 会提示没有这样的文件:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

我该怎么办?这是否意味着我无法移植到 Linux?

最佳答案

在 Windows 上,除了您提到的 includes,以下内容就足够了:

#include <winsock2.h>
#include <windows.h>

您还必须链接到 ws2_32.lib。这样做有点丑陋,但对于 VC++,您可以通过以下方式执行此操作:#pragma comment(lib, "ws2_32.lib")

Winsock 和 POSIX 之间的其他一些区别包括:

  • 您必须调用 WSAStartup()在使用任何套接字功能之前。

  • close() 现在称为 closesocket()

  • 不是将套接字作为 int 传递,而是有一个等于指针大小的 typedef SOCKET。尽管 Microsoft 有一个名为 INVALID_SOCKET 的宏来隐藏它,但您仍然可以使用与 -1 的比较来发现错误。

  • 对于设置非阻塞标志之类的事情,您将使用 ioctlsocket()而不是 fcntl()

  • 您必须使用 send()recv() 而不是 write()read ().

至于如果您开始为 Winsock 编码,您是否会失去 Linux 代码的可移植性……如果您不小心,那么是的。但是您可以编写代码,尝试使用 #ifdefs..

来弥补差距

例如:

#ifdef _WINDOWS

/* Headers for Windows */
#include <winsock2.h>
#include <windows.h>

#else

/* Headers for POSIX */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

/* Mimic some of the Windows functions and types with the
* POSIX ones. This is just an illustrative example; maybe
* it'd be more elegant to do it some other way, like with
* a proper abstraction for the non-portable parts. */

typedef int SOCKET;

#define INVALID_SOCKET ((SOCKET)-1)

/* OK, "inline" is a C99 feature, not C89, but you get the idea... */
static inline int closesocket(int fd) { return close(fd); }
#endif

然后,一旦你做了类似的事情,你就可以针对出现在两个操作系统中的函数进行编码,在适当的地方使用这些包装器。

关于C89:Windows 上的 getaddrinfo()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com