- 修改头文件的定义
-
在 Unix Sockets 应 用程序中包含头文件的语句为 #include<sys/socket.h> ,而在 Windows Sockets 应用程序中相应语句应为 #include<winsock.h> 。
- Windows Sockets DLL
- 初始化与资源释放
在
Windows Sockets
的接口函数中,提供了
WSAStartup()
与
WSACleanup()
两个函数,用于在程序开始时初始化
Windows Sockets DLL
和程序结束时释放
Windows Sockets DLL
资源
- 将套接字的类型由
- int 改为 SOCKET
在 Unix 系统中,套接字类 型定义为 int 型,而在 Windows 系统中,套接字类型被定义为 SOCKET 型,即 unsigned int 型。
- 错误码的获取与设置
-
在 Unix 系统中,获取、设 置错误码使用全局变量 errno ,而在 Windows 系统中则应将其改为用函数 WSAGetLastError() 和 WSASetLastError() 。
- 关闭套接字
-
在 Unix 系统中使用 close() 函数来关 闭套接字,而在 Windows 系统中则用 closesocket() 函数。
- 对套接字的控制
-
在 Unix 系统中,使用 ioctl() 函数和 fcntl() 函数实现 对套接字的控制,而在 Windows 系统中则应使用 ioctlsocket() 函数。
- getsockopt()
- 和 setsockopt() 函数的处理
在 Unix Sockets 和 Windows Sockets 中对这两个函数提供的支持不同。在 Windows Sockets 中 getsockopt() 与 setsockopt() 不 支持的 Berkeley Sockets 选项有:
SO_RCVLOWAT 接受低潮标志
SO_RCVTIMEO 接受超时
SO_SNDLOWAT 发送低潮标志
SO_SNDTIMEO 发送超时
IP_OPTIONS 取得 IP 头中的选项
TCP_MAXSEG 取得 TCP 最大尺寸
SO_ACCEPTCONN 套接字正在监听
SO_ERROR 取错误状态并清除
SO_TYPE 套接字类型
使用不支持的选项将返回错误码 WSAENOPROTOOPT ,它由 WSAGetLastError() 函数返回。
由于提供的支持不同,进行移植时若有必要应修改相应的源程 序。
- 使用宏
- FD_XXX 来控制 fd_set 结构
由于 Windows Sockets 某些函数在接口上虽然与 Unix Sockets 一致,但是它们的内部实现却不一样,例如,在函数 select() 的参数 中, Unix Sockets 实现套接字集合使用的是位掩码,但在 Windows Sockets 中却是使用一个 SOCKET 的数组。虽 然套接字的集合仍由 fd_set 类型表示,但在 Unix Sockets 源文件中直接修改 fd_set 结构的代码在 Windows Sockets 环境下将不能正常工作。因此 , 在进行移植时应将源程序中对结构 fd_set 的直接修改改为通过使用 FD_XXX 宏来修改。
- 应在
- Windows Sockets 程序中尽量使用 WSA 宏
在
Windows Sockets
的头文件中定义了许多以
WSA
开头的宏,在程序中使用这些宏,可以大大地增加程序的可读性。
- 阻塞调用的处理
-
Windows 是非抢先多任务环境,各任务之间的切换是通过消息驱动的,如果一个应用程序不能主动放弃其控制权,别的应用程序就不能够执行,这一点 与 Unix 操作系统有着本质的区别。对 于从 Unix Sockets 环境中移 植来的应用程序来说,阻塞问题必须考虑。
为解决阻塞问题, Windows Sockets 特增设了如下几个阻塞处理函数:
WSAIsBlocking() 检测阻塞调用是否正在进行
WSACancelBlockingCall() 取消一个正在进行的阻塞调用
WSASetBlocking() 设置自己 的阻塞处理例程
WSAUnhookBlockingHook() 恢复默认的阻塞处理例程
为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例 程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
- 尽量将阻塞调用改为基于消息的异步操作
-
在 Windows Sockets 网络程序设计 中,尽管它允许阻塞操作,但是一个阻塞可能阻塞整个 Windows 环境,而在 Unix Sockets 程序中,套接字的默认操作模式却是阻塞的。 Windows Sockets 为了支持 Windows 消息驱动机制,对网络事件采用了基于消息的异步存取策略,较好的解决了阻塞问题。为此,建议最好将源程序中的阻 塞调用改为基于消息的异步操作。
Windows Sockets 为实现异步存取操作增设了如下的有关函数:
WSAAsyncSelect() 标准 Berkeley 函数 select() 的异步版本