{
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;
}
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;
}