2.WSASendDisconnect
该函数非常特殊,一般不用.其原型是:
int WSASendDisconnect(
SOCKET s,
LPWSABUF lpOUT boundDisconnectData
);
该函数起初将套接字置为关闭状态,发送无连接的数据.当然,它只能用于支持从容关机和无连接数据的传输协议.目前还没有传输提供者支持无连接的数据.WSASendDisconnect函数的行为和利用SD_SEND参数调用shutdown函数差不多,但它另外还要发送包含在boundDisconnectData参数中的数据.后来的数据禁止在这个套接字上发送.如果调用失败,WSASendDisconnection就会返回SOCKET_ERROR.使用该函数可能会出现send函数中出现的某些错误.
注:
带外数据
对已建立连接的流套接字上的应用来说,如果需要发送的数据比流上的普通数据重要得多,便可将这些重要数据标记成"带外数据"(Out-of-band,OOB).位于连接另一端的应用可通过一个独立的逻辑信道(从概念上讲,该逻辑信道与数据流无关)来接受和处理OOB数据.
在TCP中,OOB数据由一个紧急1位标记(叫作URG)和TCP分段头中的一个16位的指针组成.这里的标记和指针把指定的下行流字节当作紧急数据.实现紧急数据的两种特殊方法目前只能在TCP.RFC793中见到,该索引对TCP进行了描述,并引入了"紧急数据"这一概念,表明TCP头中的紧急指针是紧急数据字节之后那个字节的绝对偏移.但是在RFC1122中,却将紧急偏移描述成指向紧急字节本身.
Winsock规格中,与协议无关的OOB数据和TCP的OOB数据实施(紧急数据)均采用了OOB这一术语.要查看待发数据中是否包含紧急数据,必须通过SIOCATMARK选项调用ioctlsocket函数.第9章将介绍SIOCATMARK的用法.
Winsock提供了获得紧急数据的几个方法.一是紧急数据一旦在线插入,它就会出现在普通数据流中;二是可以关闭在线插入,这样,不连续调用接受函数就会只返回紧急数据.至于控制OOB数据行为的套接字选项SO_OOBINLINE.
Telnet和Rlogin使用紧急数据是有原因的.尽管如此,除非你计划编写自己的Telnet和Rlogin,否则就应该远离紧急数据.因为它不容易定义,而且其他平台上的实施情况可能和Win32有所不同。在拨不得已的情况下使用紧急数据,必须发信号通知通信方为紧急数据执行一个独立的控制套接字,并为普通数据的传输保留主要的套接字连接.