我该如何在Windows上使用sys/socket.h?

7
我使用在Linux机器上使用socket用C语言搭建了一个服务器,它工作的很好,但是当我试图在Windows机器上使用Visual Studio运行时,出现了错误:

fatal error C1083:无法打开包括文件:'sys/socket.h':没有那个文件或目录

IDE告诉我找不到这些头文件。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

5
这些是在Windows系统上无法使用的Unix头文件。 - Yksisarvinen
4
是的,在Windows上没有sys/socket.h文件。您可以从这里开始阅读Windows文档:https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-start-page-2 - SergeyA
1
<sys/socket.h>是一个POSIX头文件。https://dev59.com/6nA85IYBdhLWcg3wEPVL - annoyingnoob
1
@yano 我认为有时候它们并不是。Windows 对 BSD sockets 有很好的支持,许多代码可以在两个系统之间轻松移植(特别是如果您使用 select)。只有当您深入研究(例如尝试将基于边缘触发的 epoll 系统移植到 Windows)时,但是这种情况下,您所使用的互操作库可能一开始就没有支持此功能。 - SergeyA
@SergeyA 我更多地考虑设置和错误报告方面。除此之外,我同意你的观点。正如 OP 发现的那样,例如完全不同的头文件集合。 - yano
显示剩余3条评论
2个回答

12

对于Windows操作系统,你需要使用winsock.h或者winsock2.h以及sys/types.h。忘记unistd.harpa/inet.hnetinet.h。根据平台使用条件编译来包含正确的头文件。

此外,在Windows下使用socket,你的应用程序必须首先调用WSAStartup函数。

在大多数情况下,Windows和Linux下的调用是相同的。但是为了获得更好的性能,需要避免使用select()(它可以工作),而是使用Windows函数。请参考文档


对于Windows,您必须使用winsock.h - 或者取代winsock.hwinsock2.h - Remy Lebeau
@RemyLebeau,你是指“对于Windows,你必须使用winsock.h” - 还是winsock2.h,它替换了**sys/socket.h**? - Ricardo
@Ricardo,询问可能比阅读文档、尝试或查看包含文件的内容更容易。winsock.h 是传统的 Windows 套接字,而 winsock2.h 是第二版(更多功能)。 - fpiette
1
@Ricardo “你是不是想说……” - 不是。我说的就是我的意思。在Windows上使用Winsock APIs时,应该使用winsock2.h而不是winsock.h。sys/socket.h在Windows上不存在。 - Remy Lebeau

2
你应该使用标题。

winsock2.h

ws2tcpip.h

ws2spi.h

此外,在导入这些库之前,您应该定义_WIN32_WINNT0x501以包括所有Windows XP或更高版本的功能,以及0x601以包括Windows 7或更高版本的功能(如果它们在任何已包含的头文件中尚未定义)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接