有时,应用程序需知道Socket的状态信息,如对方程序的地址和端口,Socket是否在等待一个函数的结束。这里有几种方法设置或核查应用程序的Socket。
1. 获取连接方的地址
当一个Socket与另一个程序连接后,可以找出此程序的网址,只需调用GetPeerName方法,给出它一个指向CString的指针和一个无符号的整数即可。GetPeerName调用方法如下:
类似地,如果不固定地把Socket与一个特定的端口或网址相连接,只在需监听有无连接请求时才使用,可以调用GetSocketName方法获取同样的Socket信息,如下:
说明:使用GetSocketName,你获得的网址有可能是0.0.0.0。这是因为Socket尚未与特定的网址连接。0.0.0.0是默认地址用于外法的连接请求。Winsock接口把它转换成你的计算机的网址。这样,虽然应用程序看到的是全0的网址,你连接的程序看到的却是实际的地址。
2. 获取和设置选项
Socket可设置几个选项,决定其操作。大多数应用程序不用调整这些选项。在这种情况下可使用GetSockOpt和SetSockOpt方法。
GetSockOpt用于检查当前各种Socket设置,此方法有4个参数,前3个是必须给出的。第1个参数指示哪个选项,第二个参数是一个缓冲指针、当前选项值拷贝送入此缓冲。第3个参数是一个整形指针,指向含有缓冲区长度的变量。第4个参数指定选项定义的级是Socket还是协议级,默认是Socket级,既SQL_SOCKET,但有一个选项定义在协议级,即IPPROTO_TCP。可用的Socket选项及其数据类型见表6-4。
表6-4 Socket 选 项
(www.xing528.com)
续表
SetSockOpt设置和修改上述选项同样需要4个参数,只是第3个参数略有差别,是个整数不是一个指针。另外,上表中SO_ACCEPPTCONN、SO_ERROR、和SO_TYPE是不能设置或修改的,它们是只读的。
要检查和设置一个特定选项的值,可以使用上述两种方法,如下所示:
3. 判断Socket是否封锁
使用CSocket类时,所有Socket通信函数自动封锁所有线程处理直到它完成为止。如果调用了Socket上的Connect函数,此函数直到连接完成或Socket超时后才能返回线程的控制。Accept、Receive和Send函数与ReceiveFrom和SendTo函数一样也是如此。那么,如果需要在这些函数返回前中断它们,怎么办呢?CSocket提供了两种办法解决这个问题。
首先,应该先检查一下,看Socket是否在封锁线程,你可以调用CancelBlockingCall方法取消此封锁的方法。此方法将使Socket放弃当前在封锁的函数,使封锁函数返回一个WSAEINTR错误条件。
警告:使用CancelBlockCall方法取消任何封锁函数而不用Accept方法可能使Socket处在一个不稳定的状态。在封锁函数被取消后唯一确定结果的方法调用是Close。
判断Socket是否在封锁,如果是,就终止它,可以按以下做法(当然在第2个线程中):
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。