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()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
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()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_RCVLOWAT 接受低潮标志SO_RCVTIMEO 接受超时SO_SNDLOWAT 发送低潮标志SO_SNDTIMEO 发送超时IP_OPTIONS 取得IP头中的选项TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_RCVTIMEO 接受超时SO_SNDLOWAT 发送低潮标志SO_SNDTIMEO 发送超时IP_OPTIONS 取得IP头中的选项TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_SNDLOWAT 发送低潮标志SO_SNDTIMEO 发送超时IP_OPTIONS 取得IP头中的选项TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_SNDTIMEO 发送超时IP_OPTIONS 取得IP头中的选项TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
IP_OPTIONS 取得IP头中的选项TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
TCP_MAXSEG 取得TCP最大尺寸SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_ACCEPTCONN 套接字正在监听SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_ERROR 取错误状态并清除SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
SO_TYPE 套接字类型使用不支持的选项将返回错误码WSAENOPROTOOPT,它由WSAGetLastError()函数返回。由于提供的支持不同,进行移植时若有必要应修改相应的源程序。
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 某些函数在接口上虽然与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 Sockets的头文件中定义了许多以WSA开头的宏,在程序中使用这些宏,可以大大地增加程序的可读性。例如:errno = WSAGetLastError();
;if (errno = WSAEWOULDBLOCK) {……
) {……
……}
这些宏是Windows Sockets就应用程序实现过程中可能会出现的错误,为便于程序的读写而专门做出的扩充,它是Windows Sockets应用程序编写人员开发程序时共同遵循的规范,因此应尽量使用这些宏,以增加程序的可读性。
Windows Sockets就应用程序实现过程中可能会出现的错误,为便于程序的读写而专门做出的扩充,它是Windows Sockets应用程序编写人员开发程序时共同遵循的规范,因此应尽量使用这些宏,以增加程序的可读性。阻塞调用的处理 Windows是非抢先多任务环境,各任务之间的切换是通过消息驱动的,如果一个应用程序不能主动放弃其控制权,别的应用程序就不能够执行,这一点与Unix操作系统有着本质的区别。对于从Unix Sockets环境中移植来的应用程序来说,阻塞问题必须考虑。为解决阻塞问题,Windows Sockets特增设了如下几个阻塞处理函数:
是非抢先多任务环境,各任务之间的切换是通过消息驱动的,如果一个应用程序不能主动放弃其控制权,别的应用程序就不能够执行,这一点与Unix操作系统有着本质的区别。对于从Unix Sockets环境中移植来的应用程序来说,阻塞问题必须考虑。为解决阻塞问题,Windows Sockets特增设了如下几个阻塞处理函数:
Windows Sockets特增设了如下几个阻塞处理函数:WSAIsBlocking() 检测阻塞调用是否正在进行WSACancelBlockingCall() 取消一个正在进行的阻塞调用WSASetBlocking() 设置自己的阻塞处理例程WSAUnhookBlockingHook() 恢复默认的阻塞处理例程为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
检测阻塞调用是否正在进行WSACancelBlockingCall() 取消一个正在进行的阻塞调用WSASetBlocking() 设置自己的阻塞处理例程WSAUnhookBlockingHook() 恢复默认的阻塞处理例程为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
WSACancelBlockingCall() 取消一个正在进行的阻塞调用WSASetBlocking() 设置自己的阻塞处理例程WSAUnhookBlockingHook() 恢复默认的阻塞处理例程为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
WSASetBlocking() 设置自己的阻塞处理例程WSAUnhookBlockingHook() 恢复默认的阻塞处理例程为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
WSAUnhookBlockingHook() 恢复默认的阻塞处理例程为不影响原来环境中的阻塞处理例程,在安装自己的阻塞处理例程时,应注意保存返回的先前安装的阻塞处理例程的程序实例指针,并在处理结束后恢复。
尽量将阻塞调用改为基于消息的异步操作 Windows Sockets程序中尽量使用WSA宏 FD_XXX来控制fd_set结构