您的位置:首页 > 其它

仿真模拟的过程

2015-08-17 16:04 399 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: