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

📄 client.c

📁 嵌入式得应用程序 基于socket得通信程序 怎么实现和服务器端交互数据和菜单
💻 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 + -