套接字编程与windows和unix/linux的混淆

Socket programming confusion with windows and unix/linux

本文关键字:linux unix 编程 windows 套接字      更新时间:2023-10-16

你好,我在c++中尝试套接字编程。我需要确认或者拒绝这个逻辑。我认为socket.h头文件是为UNIX系统设计的,而对于Windows,一切都是用winsock.h完成的。

正确吗?

对于windows,您需要winsock2.hws2tcpip.h

在Linux上,套接字函数需要sys/socket.hsys/types.h, IP相关结构需要netinet/in.h

其他差异:

  • Windows使用SOCKET作为套接字描述符而Linux使用int
  • Windows有closesocket()来关闭套接字,而Linux使用close()
  • 在Windows上,你需要在调用任何套接字函数之前调用WSAStartup(),在使用套接字完成时调用WSACleanup()
  • 在Linux上,您可以使用perror()strerror()从套接字函数打印错误。在Windows上,你必须调用WSAGetLastError()来获得错误代码,调用FormatMessage来获得错误文本。

大多数平台实现了bsd兼容的套接字API,但是不同的平台确实使用不同的.h文件来声明它们的API。所以,回答你的问题,是的,Windows使用winsock.h(和winsock2.h),而基于POSIX的平台,如Unix/Linux使用sys/socket.h代替(socket.h被定义为POSIX标准的一部分,但Windows不是POSIX兼容的平台)。如果您想编写跨平台代码,就必须考虑到这一点。以及@dbush在他的回答中概述的其他差异。

每个以"sys/…"开头的头文件都是为UNIX环境设计的。至于windows,他们倾向于在他们使用的每个头文件前加上"win"作为前缀。

如果你对windows sockets (winsocks)感兴趣,我想你应该从这里开始。

对于UNIX套接字,这个站点看起来非常有趣和简单:)