Windows Socket 网络编程——第九章 socket信息与控制

第九章 socket信息与控制

9.1 socket控制

ioctlsocket()函数负责socket的输入输出控制

int WSAAPI ioctlsocket( // 0 on success, or SOCKET_ERROR
    SOCKET s,           // a valid socket
    long cmd,           // command to perform on socket s
    u_long FAR * argp   //pointer to parameter for cmd
);

s:处在连接或非连接状态的有效的socket句柄。只有SIOCATMARK命令限制socket类型必须为流类型。
cmd:输入/输出控制命令。它包含了3种类型的命令:FIONBIO、FIONREAD和SIOCATMARK,每一个函数调用使用其中的一种命令。
argp:指向cmd参数的指针。
函数执行成功返回0;执行失败,返回SOCKET_ERROR。

9.1.1 FIONBIO

通过ioctlsocket()函数和FIONBIO命令可以将socket的操作模式从阻塞(默认的)模式变为非阻塞模式,或者从非阻塞模式变为阻塞模式。而在异步的应用程序中,FIONBIO命令是不必要的,因为WSAAsyncSelect()函数可以将socket的操作模式自动地变为非阻塞模式。
但我们输入的cmd参数值为FIONBIO是,输入参数argp的值为布尔值。argp使能或禁止非阻塞模式的方法如下:
*argp = TRUE(非值0): socket操作模式为非阻塞模式。
*argp = FALSE(0值): socket操作模式为阻塞模式。

下面的代码示例说明了如何使用FIONBIO命令。

int nRet;
u_long lOnOff = TRUE;
...
// make our sockt nonblocking
nRet = ioctlsocket(hSock, FIONBIO, (u_long FAR*)&lOnOff);
if(nRet == SOCKET_ERROR)// returns 0 on success
{
    WSAperror(hInst, hWnd, WSAGetLastError(), (LPSTR)"ioctlsocket()", TRUE);
    goto AppExit;
}

9.1.2 FIONREAD

通过ioctlsocket()函数和FIONREAD命令的结合查看可以接收的数据的字节量。对于一个数据报socket,*argp 包含了应用程序将接收到的队列中的一个数据报的字节数。而对于一个流socket,*argp通常包含了应用程序将接收到的队列中的所有字节数,但不一定如此。
应用成那个徐通常通过ioctlsocket()函数和FIONREAD命令来确定如何分配一个缓存区的大小,或者检测所接收到的具体数据量,不过这种做法回事应用程序产生不必要的开销,而且很可能滥用了系统的缓存区。因此,我们应该为应用程序分配一个足够用的缓存区,同时将数据读入应用程序缓存区并检查recv()函数的返回值,而不是查看可读取的数据量。如果没有获得想要的缓存区大小,则可以通过调节缓存区指针和再次调用recv()函数来实现。与此同时,我们需要注意:为了回应数据到达通知消息FD_READ,调用ioctlsocket()函数的FIONREAD命令不会再次激发通知消息FD_READ。因此,需要调用recv()函数或者recvfrom()函数来获得进一步的FD_RE

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值