仿真模拟的过程

来源:互联网 发布:linux日志按日期生成 编辑:程序博客网 时间:2024/05/09 03:25
int sbtransformate(char*stringbuffer,int len)
{
    char* buf = new char [len/2];
    int i;
    char sbuf[10];
    for(i=0;i<len/2;i++)
    {
        sbuf[0]=stringbuffer[i+i];
        sbuf[1]=stringbuffer[i+i+1];
        sbuf[2]=0;
        char x = strtol(sbuf,0,16);
        buf[i]=x;
    }

    memcpy(stringbuffer,buf,len/2);

   delete buf;

    return 0;

}

int bsconvert(char* binbuffer,int lenbinbuffer,char* strbuffer,int lenstrbuffer)
{
    //把二进制buffer转换为字符串的buffer
     int i;
    char sbuf[10];
    if(lenstrbuffer < (lenbinbuffer << 1))return 0;
    strbuffer[0] = 0;
    for(i=0;i<lenbinbuffer;i++)
    {
        sprintf(sbuf,"%.2x",(unsigned char)binbuffer[i]);
        strcat(strbuffer,sbuf);
    }
     return lenbinbuffer<<1;
}
int patternMatch(const char* inputstring1,int len1,const char* inishouldstring2,int len2)
{
    //模式匹配的比较
    //目标字符串x为通配字符
    int i;
    int len =len1;
    int status = 0;//正确返回结果
    for(i=0;i<len1;i++)
    {
        if((inputstring1[i] == inishouldstring2[i])||(inishouldstring2[i] == 'x')){
            continue;        
        }else{
            status = -1;//出现不匹配
            break;
        }
    }
    return status;
}

int parseReply(SOCKET sockConn,unsigned char* recvBuf,int recvlen,const char* pathConfigFile,CModsimDlg* pthis)
{
    
#define COUNTAPPKEY "count"
#define PACKINKEY    "input"
#define PACKOUTKEY   "output"
#define ITEMREMKEY  "rem"
#define MAKEPACKAPP(sbuf,i) sprintf(sbuf,"%d",i);
#define VAL_BUFF_SIZE 800
#define REM_BUFF_SIZE 50
    
    int counts = getcfgint(pathConfigFile,COUNTAPPKEY,COUNTAPPKEY);
    if(counts<=0)return 0;
    int i;
    char sappbuf[10];
    char bvalbuf[VAL_BUFF_SIZE];
    char srembuf[REM_BUFF_SIZE];
    int status = -1;
    int translen =0;
    char* bstrbuffer = new char[recvlen+recvlen+2];
    bsconvert((char*)recvBuf,recvlen,bstrbuffer,recvlen+recvlen+2);//转换为字符
    for(i=0;i<counts;i++)
    {
        MAKEPACKAPP(sappbuf,i);
        //读取每个项目的输入buf,看看是否是这个类型的输入包
        int len=getcfgstring(pathConfigFile,sappbuf,PACKINKEY,bvalbuf,VAL_BUFF_SIZE);
        //和收到的数据包进行二进制比较
        if((len == (recvlen + recvlen)) && patternMatch(bvalbuf,len,bstrbuffer,recvlen << 1)){
            //打印这个类型的包
            getcfgstring(pathConfigFile,sappbuf,ITEMREMKEY,srembuf,REM_BUFF_SIZE);
            pthis->display(srembuf);
            //提取输出的流
            len = getcfgstring(pathConfigFile,sappbuf,PACKOUTKEY,bvalbuf,VAL_BUFF_SIZE);
            if(len % 2){
                pthis->display("PACKOUTKEY len=%d",len);
            }
            else{
                if(translen=sbtransformate(bvalbuf,len)){
                    //回复给客户端
                    send(sockConn,bvalbuf,translen,0);
                    //设置正确的返回值
                    status = 0;
                    break;
                }else{
                    pthis->display("sbtransformate translen==0");
                    //出错返回
                    break;
                }        
            }
        }
    }
    delete bstrbuffer;
    return status;
}


DWORD CALLBACK tcpserverthread(VOID* para)  
{  
    //加载套接字库  
    WORD wVersionRequested;//用于保存WinSock库的版本号  
    WSADATA wsaData;  
    int err;  
    CModsimDlg* pthis=(CModsimDlg* )para;
    
     
    wVersionRequested = MAKEWORD(2,2);  
    
    err = WSAStartup( wVersionRequested, &wsaData);  
    if (err != 0)  
    {  
        printf("WSAStartup() called failed!\n");  
        return -1;  
    }  
    else  
    {  
        printf("WSAStartup() called successful!\n");  
    }  
    
    if (LOBYTE(wsaData.wVersion) != 2 ||  
        HIBYTE(wsaData.wVersion) != 2)  
    {  
        //若不是所请求的版本号2.2,则终止WinSock库的使用  
        WSACleanup();  
        return -1;  
    }  
    
    //创建用于监听的套接字  
    SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);  
    if(sockServer == INVALID_SOCKET)  
    {  
        printf("socket() called failed! ,error code is: %d", WSAGetLastError());  
        return -1;  
    }  
    else  
    {  
        printf("socket() called successful!\n");  
    }  
    
    //填充服务器端套接字结构  
    int serverport=    pthis->GetDlgItemInt(IDC_EDIT1);
    SOCKADDR_IN addrServer;  
    addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//将主机字节顺序转换成TCP/IP网络字节顺序  
    addrServer.sin_family = AF_INET;  
    addrServer.sin_port = htons(serverport);  
    
    //将套接字绑定到一个本地地址和端口上  
    err = bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));  
    if (err == SOCKET_ERROR)  
    {  
        printf("bind() called failed! The error code is: %d\n", WSAGetLastError());  
        return -1;  
    }  
    else  
    {  
        printf("bind() called successful\n");  
    }  
    //将套接字设置为监听模式,准备接收客户请求  
    err = listen(sockServer, 5);  
    if (err == SOCKET_ERROR)  
    {  
        printf("listen() called failed! The error code is: %d\n", WSAGetLastError());  
        return -1;  
    }  
    else  
    {  
        printf("listen() called successful!\n");  
    }  
    
    SOCKADDR_IN addrClient; //保存发送请求连接的客户端的套接字信息  
    int len = sizeof(SOCKADDR);  
    
    SOCKET sockConn = accept(sockServer, (SOCKADDR*)&addrClient, &len);  
    if (sockConn == INVALID_SOCKET)  
    {  
        printf("accept() called falied! The error code is: %d\n", WSAGetLastError());  
        return 0;
    }  
    else  
    {  
        pthis->display("The Server receive a new client connection![%s,%d]",inet_ntoa(addrClient.sin_addr), addrClient.sin_port);  
    }  
#define MAX_BUF_SIZE 4096
    unsigned char recvBuf[MAX_BUF_SIZE];  
    int recvlen = 0;
    int retstatus = 0;
    const char* pathConfigFile="C:\\ocx\\faxsvn\\dll\\datareply.ini";

    while(1)  
    {  
        //等待客户请求到来  
    
        
        //char sendBuf[100];  
        //sprintf_s(sendBuf, 100, "Welcome %s",inet_ntoa(addrClient.sin_addr));  
        
        //发送数据  
        //send(sockConn, sendBuf, strlen(sendBuf)+1 , 0);  
        //接收数据  
        recvlen  = recv(sockConn,(char*) recvBuf, MAX_BUF_SIZE, 0);  


        pthis->display("receive data length is: %d",recvlen);
        if(recvlen<0)break;
        //pthis->displayArr(recvBuf,recvlen);
        retstatus = parseReply(sockConn,recvBuf,recvlen,pathConfigFile, pthis);
        pthis->display("retstatus: %d",retstatus);
        //打印接收到的数据  
        
    }
    closesocket(sockConn);  //关闭连接套接字  
    
    return 0;  
}  


0 0
原创粉丝点击