⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modemdriver.cpp

📁 PPP协议的实现演示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "globals.h"/***************************************************************************                          CModemDriver.cpp  -  description                             -------------------    begin                : Sun Apr 29 2001    copyright            : (C) 2001 by Birdy57 (Stephane)    email                : birdy57@multimania.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "modemdriver.h"#ifdef WITH_MODEM//#if defined(linux)#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <limits.h>#include <errno.h>#include <syslog.h>#include <signal.h>#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>//#endif#include "string.h"CModemDriver::CModemDriver(){    m_sDEV = new char[30];    m_sInitString1 = new char[30];    m_sInitString2 = new char[30];    m_sPhoneNbr = new char[30];    m_sSpeed = new char[30];    m_sDialCommand = new char[30];    m_sCheckString = new char[30];    m_sConnectSpeed = new char[30];    m_sForceDetect = new char[30];    m_sFull = new char[30];    m_sAutoDev = new char[30];    m_sDevice = new char[30];    m_sUSR = new char[30];    m_sServerType = new char[30];    m_sServerLogin = new char[30];    m_sServerPass = new char[30];    m_cParam = new CParamConfig[17];    m_cParam[0].DriverClass = "CModemDriver";    m_cParam[0].Author = "Birdy57";    m_cParam[0].Msg = "Vers 0.5 Linux";    m_cParam[0].Guid = 0x1711;	//xxyz y=systeme z=1 drivers in    m_cParam[1].Request = "FullDuplex";    m_cParam[1].InitStr = m_sFull;    m_cParam[1].Default = "No";    m_cParam[1].MaxBufferLen = 30;    m_cParam[2].Request = "DeviceModem";    m_cParam[2].InitStr = m_sDEV;    m_cParam[2].Default = "Auto";    m_cParam[2].MaxBufferLen = 30;    m_cParam[3].Request = "InitStr1";    m_cParam[3].InitStr = m_sInitString1;    m_cParam[3].Default = "AT&K3";    m_cParam[3].MaxBufferLen = 30;    m_cParam[4].Request = "InitStr2";    m_cParam[4].InitStr = m_sInitString2;    m_cParam[4].Default = "ATM0L0";    m_cParam[4].MaxBufferLen = 30;    m_cParam[5].Request = "PhoneNbr";    m_cParam[5].InitStr = m_sPhoneNbr;    m_cParam[5].Default = "0860880310";    m_cParam[5].MaxBufferLen = 30;    m_cParam[6].Request = "ModemSpeed";    m_cParam[6].InitStr = m_sSpeed;    m_cParam[6].Default = "Auto";    m_cParam[6].MaxBufferLen = 30;    m_cParam[7].Request = "DialCommand";    m_cParam[7].InitStr = m_sDialCommand;    m_cParam[7].Default = "ATDT";    m_cParam[7].MaxBufferLen = 30;    m_cParam[8].Request = "CheckString";    m_cParam[8].InitStr = m_sCheckString;    m_cParam[8].Default = SSTRING;    m_cParam[8].MaxBufferLen = 30;    m_cParam[9].Request = "*ConnectSpeed";    m_cParam[9].InitStr = m_sConnectSpeed;    m_cParam[9].Default = "Unknow";    m_cParam[9].MaxBufferLen = 30;    m_cParam[10].Request = "ForceDetect";    m_cParam[10].InitStr = m_sForceDetect;    m_cParam[10].Default = "No";    m_cParam[10].MaxBufferLen = 30;    m_cParam[11].Request = "AutoDetected";    m_cParam[11].InitStr = m_sAutoDev;    m_cParam[11].Default = "/dev/ttyS0";    m_cParam[11].MaxBufferLen = 30;    m_cParam[12].Request = "DialAt9600baud";    m_cParam[12].InitStr = m_sUSR;    m_cParam[12].Default = "No";    m_cParam[12].MaxBufferLen = 30;    m_cParam[13].Request = "ServerType";    m_cParam[13].InitStr = m_sServerType;    m_cParam[13].Default = "French";    m_cParam[13].MaxBufferLen = 30;    m_cParam[14].Request = "ServerLogin";    m_cParam[14].InitStr = m_sServerLogin;    m_cParam[14].Default = "Auto";    m_cParam[14].MaxBufferLen = 30;    m_cParam[15].Request = "ServerPass";    m_cParam[15].InitStr = m_sServerPass;    m_cParam[15].Default = "Auto";    m_cParam[15].MaxBufferLen = 30;    m_cParam[16].Request = NULL;    //m_cParam[11].InitStr=NULL;    m_cParam[16].Default = NULL;    m_cParam[16].MaxBufferLen = 0;    // on place dans des pointeurs utilisables    m_bIsConnected = false;    m_MutexR = false;    m_MutexW = false;    m_bAutoOk = false;}CModemDriver::~CModemDriver(){    delete m_sUSR;    delete m_sDevice;    delete m_sAutoDev;    delete m_sFull;    delete m_sDEV;    delete m_sInitString1;    delete m_sInitString2;    delete m_sPhoneNbr;    delete m_sSpeed;    delete m_sDialCommand;    delete m_sCheckString;    delete m_sConnectSpeed;    delete m_sForceDetect;    delete m_sServerType;    delete m_sServerLogin;    delete m_sServerPass;    delete[]m_cParam;}/** Demmarre la connection */bool CModemDriver::Connect(){    bool bRet = false;    char ssLogin[200];    char ssPass[200];    char *sLogin;    char *sPass;    if (strstr(m_sServerType, "German") != NULL) {	sLogin = "aolnet";	sPass = "A0L2aNet";    } else {	sLogin = "aol";	sPass = "aol";    }    if (strstr(m_sServerLogin, "Auto") == NULL)	sLogin = m_sServerLogin;    if (strstr(m_sServerPass, "Auto") == NULL)	sLogin = m_sServerPass;    sprintf((char *) &ssLogin, "%s\r", sLogin);    sprintf((char *) &ssPass, "%s\r", sPass);    // Determine si il est fullduplex ou non    if (strstr(m_sFull, "Yes") != NULL)	m_bFullDuplex = true;    else	m_bFullDuplex = false;    // initialise le port    if (InitPort())	// initialise le modem	if (InitModem())	    // Numerote	    if (Dial()) {		m_cMsg->Printf("%C%M%t\n", 131);		if (!WaitFor("ogin:", 8000, NULL, NULL)) {		    m_nErrorNbr = 13;		} else		    if (write			(m_nFdPort, (char *) &ssLogin,			 strlen((char *) &ssLogin)) < 0) {		    m_nErrorNbr = 14;		} else if (!WaitFor("assword:", 8000, NULL, NULL)) {		    m_nErrorNbr = 13;		} else		    if (write			(m_nFdPort, (char *) &ssPass,			 strlen((char *) &ssPass))			< 0) {		    m_nErrorNbr = 14;		} else if (!WaitFor("onnected", 8000, NULL, NULL)) {		    m_nErrorNbr = 13;		} else {		    bRet = true;		    m_bIsConnected = true;		    if (strstr(m_sDevice, "ttyI") == NULL) {			//tcdrain (m_nFdPort);			//tcflush (m_nFdPort, TCIOFLUSH);			fcntl(m_nFdPort, F_SETFL, 0);			// modifie les param du modem			t.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);			t.c_cflag |= CS8 | CREAD | HUPCL;			t.c_iflag = IGNBRK | IGNPAR;			t.c_oflag = 0;			t.c_lflag = 0;			t.c_cc[VMIN] = 1;			t.c_cc[VTIME] = 0;			t.c_cflag |= CRTSCTS;			tcsetattr(m_nFdPort, TCSAFLUSH, &t);			cfsetispeed(&t, m_nRealSpeed);	// m_nRealSpeed auto-match to output speed			cfsetospeed(&t, m_nRealSpeed);			tcsetattr(m_nFdPort, TCSANOW, &t);			tcdrain(m_nFdPort);			tcsetattr(m_nFdPort, TCSANOW, &t);		    } else {			fcntl(m_nFdPort, F_SETFL, 0);		    }		}	    }    if (!bRet)	ClosePort();    return bRet;}/** Deconnection */bool CModemDriver::Disconnect(){    bool bRet = false;    bRet = ClosePort();    m_bIsConnected = false;    return bRet;}/** lecture */int CModemDriver::Read(char *pData, int nSize){    int nRet = ERROR;// Teste si mutex ou non    while ((!m_bFullDuplex) && m_MutexR)	usleep(1000);    m_MutexR = true;    if (!m_bIsConnected) {	m_nErrorNbr = 15;    } else if ((nRet = read(m_nFdPort, pData, (unsigned short) nSize)) < 0) {	nRet = 0;    }    m_MutexR = false;    return nRet;}/** ecriture sur le peripherique */int CModemDriver::Write(char *pData, int nSize){    int nRet = ERROR;// Teste si mutex ou non    while ((!m_bFullDuplex) && m_MutexW)	usleep(1000);    m_MutexW = true;    if (!m_bIsConnected) {	m_nErrorNbr = 15;    } else {	nRet = write(m_nFdPort, pData, (unsigned short) nSize);    }    m_MutexW = false;    return nRet;}/** Initialisation du Port */bool CModemDriver::InitPort(){    bool bRet = false;    struct termios t, oldt;    int i;    FindAuto();    switch (nSpeed) {    case 38400:	m_nRealSpeed = B38400;	break;    case 57600:	m_nRealSpeed = B57600;	break;    case 115200:	m_nRealSpeed = B57600;	break;    default:	m_nRealSpeed = B115200;	break;    }    if ((m_sDEV == NULL) || (nSpeed == 0)) {	m_nErrorNbr = 7;    } else if ((m_nFdPort = open(m_sDevice, O_RDWR | O_NDELAY)) < 0) {	m_nErrorNbr = 1;    } else {	m_bPortIsOpen = true;	/* Lecture des parametres courants */	tcgetattr(m_nFdPort, &t);	tcgetattr(m_nFdPort, &oldt);//kppp	tcdrain(m_nFdPort);	tcflush(m_nFdPort, TCIOFLUSH);	if (strstr(m_sDevice, "ttyI") != NULL)	    t.c_cc[VMIN] = 1;	// nonblocking	else	    t.c_cc[VMIN] = 0;	// nonblocking	t.c_cc[VTIME] = 0;	t.c_oflag = 0;	t.c_lflag = 0;	t.c_cflag &= ~(CSIZE | CSTOPB | PARENB);	t.c_cflag |= CS8 | CREAD;	t.c_cflag |= CLOCAL;	// ignore modem status lines	t.c_iflag = IGNBRK | IGNPAR /* | ISTRIP */ ;	t.c_lflag &= ~ICANON;	// non-canonical mode	t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHOKE);	t.c_cflag |= CRTSCTS;	cfgetispeed(&t);	if (strstr(m_sUSR, "Yes") != NULL) {	    cfsetispeed(&t, B9600);	// auto-match to output speed	    cfsetospeed(&t, B9600);	} else {	    cfsetispeed(&t, m_nRealSpeed);	// m_nRealSpeed auto-match to output speed	    cfsetospeed(&t, m_nRealSpeed);	}	tcsetattr(m_nFdPort, TCSANOW, &t);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -