为了让大家对WINSAIL在单任务系统中如何调度TCP/IP的。下面作一些说明!
(1)在窗口的CWindow::OnIdle(CObject* pObj)函数中,调用了TCP/IP的循环处理入口函数指针pSocketLoopFc指向的套接字循环函数。
CWindow::OnIdle(CObject* pObj)的源代码如下
extern BOOL bAfxNetcard; //是否在CONFIG.Sys文件中配置需要网卡标志
extern BOOL bAfxInitSocket; //是否套接字成功初始化标志
extern BOOL (*__pSocketInitFc)(); //套接字初始化函数指针
extern BOOL (*__pSocketCloseFc)();//套接字关闭函数指针
extern BOOL (*__pSocketLoopFc)(BOOL, BOOL, BOOL);//套接字循环函数指针
void CWindow::OnIdle()
{
//这里判断是否需要执行TCP/IP栈
if (bAfxNetcard && bAfxInitSocket && __pSocketLoopFc != NULL)
{
__pSocketLoopFc(TRUE, TRUE, TRUE);
}
//这里执行void CWindow::SetIdleFc()函数注册的“空闲函数指针“
if (m_pIdleFc != NULL)
{
m_pIdleFc((CObject*)this);
}
}
(2)注册TCP/IP协议栈的函数AfxRegisterNetcardEntry()源代码如下
BOOL AfxRegisterNetcardEntry(BOOL (*pSocketInitFc)(),
BOOL (*pSocketCloseFc)(), BOOL (*pSocketLoopFc)(BOOL, BOOL, BOOL))
{
if (pSocketInitFc == NULL || pSocketCloseFc == NULL)
{
return(FALSE);
}
__pSocketInitFc = pSocketInitFc;
__pSocketCloseFc = pSocketCloseFc;
__pSocketLoopFc = pSocketLoopFc;
return(TRUE);
}
(3)WinSail默认的
套接字初始化函数:GlobalInitSocket()函数
套接字关闭函数是:GlobalCloseSocket()函数
套接字循环函数:EthernetEntry()函数
EthernetEntry只处理ARP、RARP、ICMP请求以及没有发送的数据包及时发送出去,对于其它的请求则被忽略。
所以用户应用还需要重新编写自己的“套接字循环函数”。
//下面是用户自己编写的“套接字循环函数”。这个可以参照Sail3000工程的Sail2000.Cpp文件和Remote_N.Cpp文件,它实现了“文件传输、键盘按键下发、鼠标按键下发、屏幕上传、QQ聊天”等功能。
BOOL User_EthernetEntry(BOOL bSingle, BOOL bSend, BOOL bIcmp)
{
//运行默认的套接字循环函数
::EthernetEntry(bSingle, bSend, bIcmp);
//下面编写自己的SOCKET查询、读、写等等
//(略)
return(TRUE);
}
(4)由于WINSAIL运行于单任务中,所以任何地方的长时间堵塞,都会造成TCP/IP的长期堵塞。为了减少这情况,在堵塞的循环中,须调用
User_EthernetEnty(TRUE, TRUE, TRUE);
(5)如果用户注册第三方的TCP/IP栈(如Watcp等),初始化函数成功须返回TRUE,否则返回FALSE,WinSail自动对初始化函数的返回标志对bAfxInitSocket变量置位,同时别忘了配置config.Sys文件中的“Netcard”段的“netCard”键值置成 TRUE,方能与WinSail完美结合!
在WINSAIL里面的InitSystem()函数是这样初始化TCP/IP协议栈的:
bAfxInitSocket = FALSE;
if (bAfxNetcard && __pSocketInitFc != NULL &&
__pSocketCloseFc != NULL)
{
if (!__pSocketInitFc())
{
__pSocketCloseFc();
bAfxInitSocket = FALSE;
//AfxMessageBox("网络","无法加载网络!");
}
else
{
bAfxInitSocket = TRUE;
}
}
[ Last edited by firstsail on 2009-5-16 at 02:25 ]