嵌入式socket和sqlite3

用C语言+SQLite3从零实现一个在线词典(附完整源码解析) 本文详细介绍了如何使用C语言SQLite3数据库从零构建一个在线词典项目。通过完整的源码解析,展示了客户端/服务器架构的实现,涵盖了网络编程、数据库操作模块化设计等核心技能,适合有一定C语言基础的开发者进行实战练习。 阅读详情

六、嵌入式数据库设计

实验平台

l VMware workstation虚拟机内嵌口袋云系统,快速创建多种操作系统的虚拟机:(操作系统:Ubuntu18.04

CentOS,Windows10或Windows11)

l 实验目的

l 学习Linux系统下安装和运用嵌入式数据库的方法

l 掌握sqlite3数据库的基本命令

实验准备

l VMware workstation虚拟机+Ubuntu18.04系统,sqlite3安装包。

实验案例:

  1. 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数据库系统

  1. 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) 编译和运行

思考与练习题:

  1. X
  2. 2. 

七、Linux网络编程

实验平台

l VMware workstation虚拟机内嵌口袋云系统,快速创建多种操作系统的虚拟机:(操作系统:Ubuntu18.04

CentOS,Windows10或Windows11)

l实验目的

l 学习Linux系统下编写图形化网络通信应用程序

l 掌握TCP/IP通讯机制

实验准备

l VMware workstation虚拟机+Ubuntu18.04系统,安装gcc编译器和交叉编译器。

实验案例:

  1. 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)));

  }

}

  1. 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;

}

分别编译运行:

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

嵌入式课程设计实践(三)——SQLite 嵌入式课程设计实践(三)——SQLite 额,课设博文已经第三篇了,还没介绍我的课设的大概情况,那么就在SQLite前稍微介绍一下。 一、嵌入式课程设计 题目:基于嵌入式系统的数据采集与Socket通讯系统的设计与实现 内容:利用嵌入式实验箱CVT6410搭建嵌入式系统开发环境,进行Linux内核移植,烧写Linux系统,编写应用程序,完成以下功能,并撰写嵌入式系统设计报告 阅读详情

相关推荐

嵌入式Linux实战:基于SocketSQLite的高并发局域网聊天室开发

本文详细介绍了基于嵌入式Linux开发高并发局域网聊天室的实战经验,重点讲解了Socket网络编程与SQLite数据库的应用。项目采用C/S架构,实现用户认证、实时消息传递历史记录存储等功能,优化了线程池数据库性能,适用于树莓派等嵌入式设备。

weixin_29266679的博客 336

linux socket函数编程

服务器socket-&gt;bind-&gt;listlen-&gt;accept-&gt;write 在写这个服务器的代码过程中遇到很多容易出错的地方 1、serveraddr.sin_port = htons(portnumber); 这里一点记住是htons()函数,用htonl会出错,有大小端问题,端口号会变 2、if((newfd = accept(sockfd,(...

weixin_40405692的博客 609

网络编程服务器端绑定ip设置

在使用socket编写服务器程序时,设置服务器绑定的sockaddr_in结构往往会困扰很多同学,sockaddr_in结构中sin_famliysin_port(注意要使用htons转换为网络序)就不说了,相信大家已知道。sin_addr是要设置的监听地址。sin_addr类型为: struct in_addr { in_addr_t s_addr; }; 这里有几个常用的值: (1)sin_addr.s_addr = INADDR_ANY;(0x00000000) (2)sin_addr.s_addr

m0_67392811的博客 725

linux客户端tcp连接打印自身IP

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> void error_handling(char* message); int main(int argc, char* argv[]) { int sock; stru.

qq_38781075的博客 833

Linux网络编程入门

(一)Linux网络编程--网络知识介绍Linux网络编程--网络知识介绍客户端服务端         网络程序普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端服务器端. 客户端        在网络程序中,如果一个程序主动外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我们的ftp程序主动同

小生物语 1万+

linux网络编程中端口号ip地址转换方法

1、端口号 方法1: 2、ip地址转换

modi000的博客 4112

45、无依赖信息查询系统(C语言+SQLite3+HTML)

这是一个基于C语言+SQLite3+HTML的无依赖信息查询系统,主要功能包括用户登录验证、商品搜索详情查看。系统采用轻量级设计,无需服务器依赖,编译后单文件运行。核心技术包括:C语言实现HTTP服务器socket通信、SQLite3文件数据库存储用户商品数据、HTML静态界面交互。核心流程为用户登录后可通过关键词搜索商品并查看详情,支持中文关键词模糊查询。系统亮点包括SQL预处理防注入、URL编解码兼容中文、动态HTML拼接展示查询结果。数据库设计包含用户表商品表,支持商品名称、价格、图片等信息的

weixin_46607526的博客 973

嵌入式-----网络编程

本文系统介绍了网络编程的核心知识体系,包括基础理论、TCP/UDP编程、高级网络技术、数据库操作Web开发。全文从底层协议到上层应用循序渐进,为网络应用开发提供了全面的技术指导。

ruri_eiko的博客 1237

网络编程基础知识(UDP、TCP)、多路IO、HTTP、数据库sqlite3

用来“定义数据库对象结构”,比如建、建表、改表结构、删表。

qaxzy的博客 393

嵌入式学习】嵌入式类找工作面试题

嵌入式类找工作面试题

weixin_44463519的博客 53

C语言小项目之基于sqlite3数据库的电子词典项目

该电子词典项目主要有如下功能:1、用户注册登录验证2、服务器端将用户信息历史记录保存在数据库中。客户端输入用户名密码,服务器端在数据库中查找、匹配,返回结果3、单词在线翻译4、根据客户端输入的单词在字典文件中搜索5、历史记录查询提示:以下是本篇文章正文内容,下面案例可供参考例如:以上就是今天要讲的内容,本文仅仅简单介绍了C语言中常见函数的使用,涉及到了应用层的编程知识,例如socket编程、数据库编程,文件IO等。

m0_57730390的博客 2047

uml+oopc嵌入式c语言开发精讲_嵌入式软件开发/C语言开发工程师专业技能简历范文...

专业技能(案例一)嵌入式c/c++编程javaweb编程mysql专业技能(案例二)SQLC/C++LinuxPythonshell专业技能(案例三)C语言C++, ARM汇编TCP/UDP以及socket使用Keil5,IAR开发工具QT,PHP,SQL,SHELLARM,STM32体系结构的应用与开发Linux内核,Linux字符设备驱动开发bootloder移植,kernel移植及Linux...

weixin_39583521的博客 157

sqlite3】网络socket编程温度采集智能存储与上报项目技术------sqlite3数据库基础

sqlite3】网络socket编程温度采集智能存储与上报项目技术------sqlite3数据库基础

道阻其长,未来可期。笔耕不辍,行则将至! 6390

从零构建嵌入式Linux聊天室:Socket编程与SQLite的实战碰撞

本文详细介绍了如何在嵌入式Linux环境下从零构建一个高效的局域网聊天室系统,重点解析了Socket编程与SQLite数据库的实战应用。通过优化TCP连接、设计精简消息协议以及高效使用SQLite,开发者可以在资源受限的嵌入式设备上实现稳定可靠的多用户通信。文章还提供了性能优化调试技巧,帮助开发者快速掌握嵌入式网络编程的核心技术。

gpt4scribbler的博客 650

Linux应用之在线词典-数据库的实现

服务端recvfrom到的英文会放在buf缓冲区中,在利用sqlite3中的exec函数族进行查找,返回值也在buf中,只需要对buf进行处理,就得到了查询到的中文。printf("[%s:%d]无法打开数据库:%s\n",__FUNCTION__,__LINE__,sqlite3_errmsg(db));printf("[%s:%d]收到的数据:{%s}\n",__FUNCTION__,__LINE__,buf);准备好了数据库UDP通信,接下来就是对UDP接收的代码进行优化,实现查询数据的发送。

huqiqiqiqijie的博客 346

备忘录

1.Ubuntu下安装SQLite3 sudo apt-get install sqlite3 图形界面 sudo apt-get install sqlitebrowser 2.android 模拟器与本地PC进行socket通信 IP用本地IP,端口用模拟器名字,如5554,5556 3.Ubuntu10.04下使用工具mkubiimage-mlc2缺少

jdh99的专栏 4489

嵌入式linux项目介绍与分享-基于 Linux 下 Socket 网络编程的局域网聊天室

本项目是基于 Linux 下 Socket 网络编程的局域网聊天室,实现了账号注册与登录、私聊消息、群发消息、发送离线消息、查看聊天记录、修改昵称密码等功能,并设置管 理员,实现将用户禁言、解禁、踢出聊天室等,采用多线程并发服务器模型处理多个客户端的同时连接请求,服务器创建并管理用户数据、在线用户数据、聊天数据、离线消息数据等 SQlite 数据库,并提供后台服务,客户端通过 TCP 协议建立与服务器的稳定连接,并通过格式化输入输出实现与用户的交互。

szq0909的博客 3599

PowerSync Node.js SDK快速入门:Better-SQLite3 Worker、代理支持与加密配置实战

如果你想在 Node.js 应用里拥有**本地优先(Local-First)+ 实时同步**的能力,PowerSync Node.js SDK 值得重点关注。它把嵌入式SQLite 数据库搬进 Node.js 客户端,数据先落本地、再与服务端自动同步,读写都快如闪电。本文面向新手,带你 5 分钟跑通安装,并搞懂三个实战主题:Better-SQLite3 Worker 工作原理、代理(Proxy

gitblog_00181的博客 491
上一篇: linux qt实验
Aangxc
博客等级 码龄3年 35粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值