套接字编程与windows和unix/linux的混淆
Socket programming confusion with windows and unix/linux
你好,我在c++中尝试套接字编程。我需要确认或者拒绝这个逻辑。我认为socket.h
头文件是为UNIX系统设计的,而对于Windows,一切都是用winsock.h
完成的。
正确吗?
对于windows,您需要winsock2.h
和ws2tcpip.h
。
在Linux上,套接字函数需要sys/socket.h
和sys/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套接字,这个站点看起来非常有趣和简单:)
相关文章:
- createFile() 和 DeviceIoControl() 等效于 Unix/Linux 中的卷设备
- 打开Unix,Linux系统呼叫许可,拒绝Arduino Uno
- SetConsoleCtrlHandler equivalent for Unix/Linux C++
- 如何在Windows中为Unix/Linux编译C++应用程序
- 调试C :./nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录
- C++中的分段错误 - Rougewave(仅在Linux中而不是在Unix中)
- 如何使本机Unix/Linux守护进程在Android上工作
- Execlp()不接受参数列表,只接受命令.UNIX/LINUX编程
- LD_PRELOAD适用于所有风格的 unix/linux 吗?
- Unix 和 Linux API 标头是否与C++兼容
- 在Unix/Linux(Ubuntu)中编译头文件和两个.cpp文件
- 如何将 "kill -3 <jvm pid>" 标准输出单独重定向到 linux 和 unix 中的文件?
- 为什么 QCoreApplication 在 Unix/Linux 上默认调用 'setlocale(LC_ALL, " " )'?
- 套接字编程与windows和unix/linux的混淆
- 是否有aes 256与CBC加密在ubuntu/linux/unix
- 如何在公共linux/unix集群上为编译器添加c++库
- 文件/运行时权限的Unix/Linux API
- 使用c++ TCP客户端套接字在特定的网络接口Linux/Unix
- Linux和Solaris Unix: Coredump在函数的末尾
- 在Linux/Unix中有类似futex的功能吗