MXCHIP在API介绍中,对于FD系列的功能函数只是简单的一带而过
FD_ZERO(p)
清空指针 p指向的套接字集合
FD_SET(n, p)
在指针p 指向的套接字集合中增加套接字 n
FD_CLR(n, p)
在指针p 指向的套接字集合中删去套接字 n
FD_ISSET(n, p)
查看在指针p 指向的套接字集合中的套接字 n是否被置位,返回 1表示置位,返回0表示未被置位
虽然没有深入的介绍函数的作用
但是实际使用过程中,个人觉得FD_ISSET(n, p) 这个函数是非常重要的
它返回的值直接决定能否该套接字下能否进行数据的发送
譬如:
for(i=0;i<8;i++) {
if (clientfd【i】 != -1) {
if (FD_ISSET(clientfd【i】, &readfds)) {
tmp = get_tem();
itostr(SEND_buff,tmp/100);
strcat(SEND_buff,".");
itostr(TMP_buff,tmp%100);
strcat(SEND_buff,TMP_buff);
itostr(AD_buff,ADC_ConvertedValue[0]);
strcat(SEND_buff,"&");
strcat(SEND_buff,AD_buff);
SEND_str_len = strlen(SEND_buff)-1;
send(clientfd【i】, "Temperture&AD Value:", sizeof("Temperture&AD Value:"), 0);
send(clientfd【i】, SEND_buff, SEND_str_len, 0);
send(clientfd【i】, "\r\n", sizeof("\r\n"), 0);
}
else if (FD_ISSET(clientfd【i】, &exceptfds))
clientfd【i】 = -1;
}
}
上面这段代码中,如果FD_ISSET被置位,才能够发送相关的数据
实际使用中,如果没有向OPEN1081发送数据的话,数据是不会被发送至受端的
再看:
for(i=0;i<8;i++) {
if (clientfd【i】 != -1) {
if (!FD_ISSET(clientfd【i】, &readfds)) {
tmp = get_tem();
itostr(SEND_buff,tmp/100);
strcat(SEND_buff,".");
itostr(TMP_buff,tmp%100);
strcat(SEND_buff,TMP_buff);
itostr(AD_buff,ADC_ConvertedValue[0]);
strcat(SEND_buff,"&");
strcat(SEND_buff,AD_buff);
SEND_str_len = strlen(SEND_buff)-1;
send(clientfd【i】, "Temperture&AD Value:", sizeof("Temperture&AD Value:"), 0);
send(clientfd【i】, SEND_buff, SEND_str_len, 0);
send(clientfd【i】, "\r\n", sizeof("\r\n"), 0);
}
else if (FD_ISSET(clientfd【i】, &exceptfds))
clientfd【i】 = -1;
}
}
这段代码,FD_ISSET未被置位,则允许数据的发送
然通过这两段代码的测试,似乎可以理解,FD_ISSET其实是在检测通道是否有数据接收或者发送
如果有,则置位,否则复位。
很希望庆科的大神们能把这几个函数和通信的关系好好介绍一下
本帖最后由 ljj3166 于 2014-12-7 22:34 编辑
在早期UNIX系统开发中,为了解决IO口多路复用的问题,引入了select ,同时引入的还有FD_SET,FD_ISSET等工具。最常见的用法是在socket编程中。这些工具的标准头文件是:
sys/select.h
我们的接口已经基本上标准化了,文档中不清楚的地方可以参考POSIX标准,见附件。不过需要注意的是,select中有个参数是execptfd,目前还不支持(如下)。
网络参考资料如下
http://mkssoftware.com/docs/man3/select.3.asp
-
POSIX.chm
(2014-12-11 11:01 上传)
5.64 MB, 下载次数: 3
学习了....年底了,送走一拨检查的又来一拨...眼看时间到了,没时间系统的学习一下MICO...希望过段时间闲下来好好看看