在程序中如何通过modem建立拨号网络?这个问题困扰了我好久,但最近工作需要,只好花时间仔细学习了一把。
首先把Modem的driver安装好之后,使用Hyper Terminal工具测试了一下,使用AT命令可以和我的手机互相打通电话。
然后使用Windows的"New Connection Wizard"新建一个网络连接,Google了老半天,终于找到了一个可以用的ISP,263的,电话号码是95963,用户名和密码都是263。这样使用Windows的工具建立拨号网络,成功的连上了ISP的server,可以使用Browser浏览web page了。
然后拨号网络怎么办呢?原来,需要调用Windows的RAS(Remote Access Service) API,有一些相应的函数可用,但有一个入口参数是,使用Windows的拨号工具建立的拨号网络连接,这个是 RasDial 函数中需要的 EntryName。我不想这样做,又google了老半天,有一个牛人提供了这样一种方法,在自己的程序中,调用 RasDial 之前,建立一个拨号网络连接,然后调用 RasDial,在拨号网络断开之后,再把这个拨号网络连接删除。我想了想,还是放弃了这种方法。
好了,下面贴出我的 Sample Code:
这个是回调函数,在调用RasDial建立拨号连接的过程中,Windows会不停的调用这个函数来报告当前拨号网络的状态和错误信息,非常有用,细节请参考MSDN
void WINAPI RasDialFuncCallback(UINT, RASCONNSTATE state, DWORD err)
{
printf("RasDialFunc, connection state:[%d], error code:[%d]/n", state, err);
}
bool dialUpISP()
{
RASDIALPARAMSA dialParams;
memset(&dialParams, 0, sizeof(dialParams));
dialParams.dwSize = sizeof(dialParams);
//这个变量保存的是这个拨号网络的Handle,以后对这个连接操作都需要这个handle
HRASCONN hRasConnectionHandle = NULL;
//这个 c95963 就是使用Windows的"New Connection Wizard"建立的拨号网络连接的名字,自己随便起的,
strcpy_s(dialParams.szEntryName, "c95963");
strcpy_s(dialParams.szPhoneNumber, "95963");
strcpy_s(dialParams.szUserName, "263");
strcpy_s(dialParams.szPassword, "263");
RasDialA(NULL, NULL, &dialParams, 0, RasDialFuncCallback, &hRasConnectionHandle);
return true;
}
好了,Windows下的搞定了,下面需要学习Linux下如何搞了。