📄 client.c
字号:
//////////////////////////////////////////
// 终端 程序 client.c
//////////////////////////////////////////
#include <stdio.h>
#include "syshead.h"
#include "datadef.h"
#include "key.h"
#include "fun.h"
#include "commfun.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//////////////////////////////////////////////////
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/select.h>
#define PORT 6500
char ip[20] = "124.128.34.152";
#define MAXDATASIZE 100
sflash dataflash;
#define MENU_NUM 8
#define DISP_NUM 4
#define MAXDATASIZE 100
/////////////////////////////////////////
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>
#include <sys/time.h>
////数据接收函数
//////////////////////////////////////////////////////////////////////////////////////////////
serversend(int sockfd, char *psDataBuff, int wDataLen)
{
int i,Ret;
char sendBuf[1024];
char CRC=0;
if (wDataLen>=255)//超过Ctsi要求的数据长度
return -3;
memset(sendBuf,0,sizeof(sendBuf));
sendBuf[0]=0x87;
CRC+=sendBuf[0];
sendBuf[1]=wDataLen+3;
CRC+=sendBuf[1];
for (i=0;i<wDataLen;i++)
{
sendBuf[i+2]=psDataBuff[i];
CRC+=psDataBuff[i];
}
CRC=CRC%256;//模256 小民:crc8校验
CRC=~CRC;//求反
CRC++;//取补
sendBuf[wDataLen+2]=CRC;
send(sockfd, sendBuf, wDataLen+3, 0);
}
//数据显示函数
///////////////////////////////////////////////////////////////////////////////////////////
int printd(int socket,char buf[1000],int len)
{
int DISP_NUM=4;
currmenu = 0;
startmenu = 0;
revertmenu = 0;
int t=0;
int h=0;
char menustr[16][20];
if(buf[1]==0xB3&&buf[3]==0x01) //菜单数据
{
for(int i==4;i<len-1;i++)//////////////////////////////把要显示的菜单放进一个二维数组
{
if(buf[i]==0xff)
{
t++;
h=0;
}
else
{
menustr[t][h]=buf[i];
h++;
}
}
/////菜单显示
MENU_NUM=++t;
while(1)
{
clearscr();
for (i = 0; i < DISP_NUM; i++)
{
if (revertmenu == i)
printcenter(i, menustr[startmenu + i], 1); // 反显
else
printcenter(i, menustr[startmenu + i], 0);
}
while(1)
{
key_char = GetChar();
if (key_char == KEY_CANCEL)
{
clearscr();
return 0;
}
if (key_char == 10)
{
switch (currmenu)
{
case 0:
serversend(socket,"0x01",1);
break;
case 1:
serversend(socket,"0x02",1);
break;
case 2:
serversend(socket,"0x03",1);
break;
case 3:
serversend(socket,"0x04",1);
break;
case 4:
serversend(socket,"0x05",1);
break;
case 5:
serversend(socket,"0x06",1);
break;
case 6:
serversend(socket,"0x07",1);
break;
case 7:
serversend(socket,"0x08",1);
break;
}
}
if (key_char == KEY_DOWNARROW)
{
if (currmenu < MENU_NUM - 1)
{
currmenu++;
}
if (revertmenu < DISP_NUM - 1)
{
revertmenu++;
}
else
{
if (startmenu < MENU_NUM - 1)
{
startmenu++;
}
}
break;
}
if (key_char == KEY_UPARROW)
{
if (currmenu > 0)
{
currmenu--;
}
if (revertmenu > 0)
{
revertmenu--;
}
else
{
if (startmenu > 0)
{
startmenu--;
}
}
break;
}
}
}
}
/////密码显示函数部分
if(buf[1]==0xB3&&buf[3]==0x04)
{
char str[100],rec[50];
char xi[20];
U8 ch = 0;
U8 row = 0, col = 0;
i=0;
memset(str, 0, sizeof(str));
clearscr();
showcursor();
printx(0, 0, "请输入密码 :", 0);
while(1)
{
getcursor(&row, &col);
if (row == 3)
{
clearscr();
printx(0, 0, "输入密码:", 0);
}
if ((ch = GetCh()) < 128) //////////////////////////////这个地方有问题,不是以*出现的字符
{
rec[i]=ch;
xi[i]='*';
i++;
print(xi,0);
if (ch == 10)
{
serversend(socket,rec,strlen(rec));
break;
}
//else
//fprint("%c", ch);
}
}
hidecursor();
}
}
//接收函数 ******************************************************************
////////////////////////////////////////////////////////////////////////////////////////////
int serverrec(int sockfd)
{
int i,len;
char CRC=0;
char xuan[20];
char buf[1024];
int recvbytes;
memset(buf,0,sizeof(buf));
if ((recvbytes=recv(sockfd,buf,1024,0)) ==-1)
{
printfright(1,"recv出错,"0);
}
else
{
len=strlen(buf);
for(i=0;i<len-1;i++)
{
CRC+=buf[i];
}
CRC=CRC%256;//模256 累加和校验
CRC=~CRC;//求反
CRC++;//取补
if(CRC==buf[len-1])
{
printd(socket,buf,len);//数据显示函数
}
int main()
{
int sockfd, numbytes;
char recvbuf[1000];
struct hostent *he;
struct sockaddr_in their_addr;
int i = 0;
int j = 0;
int temp = 0;
int flag = 0;
char sendbuf[1024];
////////////////////////创建socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("error");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
inet_aton(ip, &their_addr.sin_addr);
bzero(&(their_addr.sin_zero), 8);
if (connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
fd_set readfds;
while(1)
{
struct timeval tv;
tv.tv_sec=5;
tv.tv_usec=50000;
FD_ZERO(&readfds);//清空fdset与所有文件句柄的联系。
FD_SET(sockfd,&readfds);//建立文件句柄consock与fdR的联系。
select(sockfd+1, &readfds,NULL,NULL,&tv);
if (FD_ISSET(sockfd, &readfds)) //可以读
{
serverrec(sockfd);
}
else
{
printright(1,"has not received time out",0);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* if (send(sockfd, sendbuf, 1000, 0) == -1)
{
perror("send");
close(sockfd);
exit(1);
}
if (recv(sockfd, recvbuf, 1000, 0) == -1)
{
perror("recv");
close(sockfd);
exit(1);
}
printf("recv:%s\n", recvbuf);
close(sockfd);
return 0;*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -