六、嵌入式数据库设计
实验平台
l VMware workstation虚拟机内嵌口袋云系统,快速创建多种操作系统的虚拟机:(操作系统:Ubuntu18.04
CentOS,Windows10或Windows11)
l 实验目的
l 学习Linux系统下安装和运用嵌入式数据库的方法
l 掌握sqlite3数据库的基本命令
实验准备
l VMware workstation虚拟机+Ubuntu18.04系统,sqlite3安装包。
实验案例:
- Linux下安装sqlite3数据库
本实例中用到的SQL.db文件为预先建好的数据库。
hadoop@ubuntu:~/catkin_ws$ ./configure
hadoop@ubuntu:~/catkin_ws$ make
hadoop@ubuntu:~/catkin_ws$ make install
测试:在终端输入sqlite3,进入sqlite>环境里,表示安装成功。

2)在sqlite环境下执行基本命令
在sqlite>提示符后要输入.表示命令
如果进入了…>模式,表示是进入SQL数据语言模式了,此时要想退出…>模式,只要输入一条完整的SQL语句就行了,也就是末尾要加上;(分号)这个符号就可以退回到sqlite>状态”。
,open:打开数据库,
.database查看当前的数据库
.tables查看数据表
.schema tablename查看数据表结构
.dump显示数据库结构,可用来备份保存数据库。
. quit/exit这两个命令用于退出sqlite数据库系统

- Linux下Sqlite编程与编译
1)编写源码
/***sqlite.c*****/
#include<stdio.h>
#include<sqlite3.h>
int main()
{ sqlite3 *db=NULL;
int rc;
char *Errormsg;
int row;
int col;
char **Result;
int i=0;
int j=0;
rc =sqlite3_open("test.db",&db);
if(rc)
{fprintf(stderr,"cant,t open:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
else
{printf("open successly!\n"); }
char *sql="create table people(ID integer primary key,name varchar(10),age integer,num varchar(18))";
sqlite3_exec(db,sql,0,0,&Errormsg);
sql="insert into people values(1,'LiMing',20,'362302198901010214')";
sqlite3_exec(db,sql,0,0,&Errormsg);
sql="insert into people values(2,'LiSi',21,'362302199005010254')";
sqlite3_exec(db,sql,0,0,&Errormsg);
sql="insert into people values(3,'WangWu',20,'362302198905050954')";
sqlite3_exec(db,sql,0,0,&Errormsg);
sql="select * from people";
sqlite3_get_table(db,sql,&Result,&row,&col,&Errormsg);
printf("row=%d column=%d\n\n",row,col);
for(i=0;i<row+1;i++)
{ for(j=0;j<col;j++)
{printf("%s\t",Result[j+i*col]);}
printf("\n");
}
sqlite3_free(Errormsg);
sqlite3_free_table(Result);
sqlite3_close(db);
return 0;
}
2) 编译和运行

思考与练习题:
- X
- 2.
七、Linux网络编程
实验平台
l VMware workstation虚拟机内嵌口袋云系统,快速创建多种操作系统的虚拟机:(操作系统:Ubuntu18.04
CentOS,Windows10或Windows11)
l实验目的
l 学习Linux系统下编写图形化网络通信应用程序
l 掌握TCP/IP通讯机制
实验准备
l VMware workstation虚拟机+Ubuntu18.04系统,安装gcc编译器和交叉编译器。
实验案例:
- Linux下手动编写网络通信程序并编译执行
本试验判断用户输入的是IP还是域名,首先假设输入的是IP,所以先调用inet_aton, 失败后再调用gethostbyname而得到信息。
/*******(hostname_ip.c) ****/
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "sys/types.h"
#include "sys/socket.h"
#include "unistd.h"
#include "netinet/in.h"
#include "netdb.h"
int main(int argc ,char **argv)
{
struct sockaddr_in addr;
struct hostent *host;
char **alias;
if(argc<2)
{
fprintf(stderr,"Usage:%s hostname|ip..\n\a",argv[0]);
exit(1);
}
argv++;
for(;*argv!=NULL;argv++) {
if(inet_aton(*argv,&addr.sin_addr)!=0)
{
host=gethostbyaddr((char *)&addr.sin_addr,4,AF_INET);
printf("Address information of Ip %s\n",*argv);
}
else
{
host=gethostbyname(*argv);
printf("Address information of host %s\n",*argv);
}
if(host==NULL)
{
fprintf(stderr,"No address information of %s\n",*argv);
continue;
}
printf("Official host name %s\n",host->h_name);
printf("Name aliases:");
for(alias=host->h_aliases;*alias!=NULL;alias++)
printf("%s ,",*alias);
printf("\nIp address:");
for(alias=host->h_addr_list;*alias!=NULL;alias++)
printf("alias=%s, \n",*alias);
//printf("%s ,",inet_ntoa(*(struct in_addr *)(*alias)));
}
}

- C/S通信
/**********tcpserver.c**********/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/************************************************************************************************************************
1、int socket(int family,int type,int protocol)
family:
指定使用的协议簇:AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL(UNIX协议) AF_ROUTE(路由套接字) AF_KEY(秘钥套接字)
type:
指定使用的套接字的类型:SOCK_STREAM(字节流套接字) SOCK_DGRAM
protocol:
如果套接字类型不是原始套接字,那么这个参数就为0
2、int bind(int sockfd, struct sockaddr *myaddr, int addrlen)
sockfd:
socket函数返回的套接字描述符
myaddr:
是指向本地IP地址的结构体指针
myaddrlen:
结构长度
struct sockaddr{
unsigned short sa_family; //通信协议类型族AF_xx
char sa_data[14]; //14字节协议地址,包含该socket的IP地址和端口号
};
struct sockaddr_in{
short int sin_family; //通信协议类型族
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //IP地址
unsigned char si_zero[8]; //填充0以保持与sockaddr结构的长度相同
};
3、int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)
sockfd:
socket函数返回套接字描述符
serv_addr:
服务器IP地址结构指针
addrlen:
结构体指针的长度
4、int listen(int sockfd, int backlog)
sockfd:
socket函数绑定bind后套接字描述符
backlog:
设置可连接客户端的最大连接个数,当有多个客户端向服务器请求时,收到此值的影响。默认值20
5、int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
sockfd:
socket函数经过listen后套接字描述符
cliaddr:
客户端套接字接口地址结构
addrlen:
客户端地址结构长度
6、int send(int sockfd, const void *msg,int len,int flags)
7、int recv(int sockfd, void *buf,int len,unsigned int flags)
sockfd:
socket函数的套接字描述符
msg:
发送数据的指针
buf:
存放接收数据的缓冲区
len:
数据的长度,把flags设置为0
*************************************************************************************************************************/
int main(int argc, char *argv[])
{
int fd, new_fd, struct_len, numbytes,i;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buff[BUFSIZ];
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8000);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero), 8);
struct_len = sizeof(struct sockaddr_in);
fd = socket(AF_INET, SOCK_STREAM, 0);
while(bind(fd, (struct sockaddr *)&server_addr, struct_len) == -1);
printf("Bind Success!\n");
while(listen(fd, 10) == -1);
printf("Listening....\n");
printf("Ready for Accept,Waitting...\n");
new_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len);
printf("Get the Client.\n");
numbytes = send(new_fd,"Welcome to my server\n",21,0);
while((numbytes = recv(new_fd, buff, BUFSIZ, 0)) > 0)
{
buff[numbytes] = '\0';
printf("%s\n",buff);
if(send(new_fd,buff,numbytes,0)<0)
{
perror("write");
return 1;
}
}
close(new_fd);
close(fd);
return 0;
}
/***********************tcpclient.c**************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[BUFSIZ];
struct sockaddr_in their_addr;
printf("break!");
while((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1);
printf("We get the sockfd~\n");
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(8000);
their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(their_addr.sin_zero), 8);
while(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)) == -1);
printf("Get the Server~Cheers!\n");
numbytes = recv(sockfd, buf, BUFSIZ,0);//接收服务器端信息
buf[numbytes]='\0';
printf("%s",buf);
while(1)
{
printf("Entersome thing:");
scanf("%s",buf);
numbytes = send(sockfd, buf, strlen(buf), 0);
numbytes=recv(sockfd,buf,BUFSIZ,0);
buf[numbytes]='\0';
printf("received:%s\n",buf);
}
close(sockfd);
return 0;
}
分别编译运行:

开启另一个终端运行客户端:

336




被折叠的 条评论
为什么被折叠?



