更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
具体代码如下:
电脑端:
/*
客户端部分:
*/
#include "show.h"
int src;
void fun1()
{
close(src);
exit(0);
}
int main(char **argv)
{
signal(SIGINT,fun1);
src = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if(src == -1)
{
perror("创建套接字失败!\n");
return -1;
}
int on=1;
setsockopt(src,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //设置端口重复使用
struct sockaddr_in addr1;
bzero(&addr1,sizeof(addr1));
addr1.sin_family = AF_INET;
addr1.sin_addr.s_addr = htonl(INADDR_ANY); //客户端IP地址
addr1.sin_port = htons(10000); //客户端端口号
int ret;
ret = bind(src, (struct sockaddr *)&addr1, sizeof(addr1)); //绑定IP地址与端口号
if(ret == -1)
{
perror("绑定失败!\n");
return -1;
}
struct sockaddr_in addr2;
bzero(&addr2,sizeof(addr2));
addr2.sin_family = AF_INET;
addr2.sin_addr.s_addr = inet_addr("192.168.1.157"); //服务器IP地址
addr2.sin_port = htons(20000); //服务器端口号
ret = connect (src, (struct sockaddr *)&addr2, sizeof(addr2)); //申请连接服务器
if(ret == -1)
{
perror("链接服务器失败!\n");
return -1;
}
char buf[1024];
printf("输入需要复制的文件名!\n");
bzero(buf,1024);
scanf("%s",buf);
write(src, buf, strlen(buf));
int fd = open(buf,O_RDONLY);
while(1)
{
bzero(buf,1024);
int n = read(fd, buf, 1024); //n为实际读取到的字节数
char *tmp = buf; //指向存放写入数据的缓冲区(实际大小)
if( n == 0) //读取完毕
break;
if( n == -1 )
{
perror("读取文件失败!\n");
break;
}
if( n > 0 )
{
int m = write(src, tmp, n); //m为实际写入的字节数
n -= m; //n为未写入的字节数
tmp += m; //tmp为未写入的数据缓冲区实际大小
}
}
printf("读取发送完毕!\n");
close(src);
}
开发板:
/*
服务器部分
*/
#include "show.h"
int src;
int dst;
void fun1()
{
close(src);
close(dst);
display_close();
exit(0);
}
int main()
{
signal(SIGINT,fun1);
src = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
if(src == -1)
{
perror("创建套接字失败!\n");
return -1;
}
int on=1;
setsockopt(src,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //设置端口重复使用
struct sockaddr_in addr1;
bzero(&addr1,sizeof(addr1));
addr1.sin_family = AF_INET;
addr1.sin_addr.s_addr = htonl(INADDR_ANY); //服务器IP地址
addr1.sin_port = htons(20000); //服务器端口号
int ret;
ret = bind(src, (struct sockaddr *)&addr1, sizeof(addr1)); //绑定IP地址与端口号
if(ret == -1)
{
perror("绑定失败!\n");
return -1;
}
struct sockaddr_in addr2;
bzero(&addr2,sizeof(addr2));
socklen_t len = sizeof(addr2);
addr2.sin_family = AF_INET;
addr2.sin_addr.s_addr = inet_addr("192.168.1.156"); //客户端IP地址
addr2.sin_port = htons(10000); //客户端端口号
ret = listen(src, 1);
if(ret == -1)
{
perror("链接服务器失败!\n");
return -1;
}
dst = accept(src, (struct sockaddr *)&addr2,&len); //接受客户端的连接申请并生成新的文件描述符
int n;
char buf1[100];
char buf[1024];
display_open(); //打开显示屏
bzero(buf1,100);
n = read(dst,buf1,100);
int fd = open(buf1,O_RDWR|O_CREAT|O_TRUNC);
while(1)
{
bzero(buf,1024);
int sum = read(dst, buf, 1024); //n为实际读取到的字节数
char *tmp = buf; //指向存放写入数据的缓冲区(实际大小)
if( sum == 0) //读取完毕
{
printf("复制完成!\n");
break;
}
if( sum == -1 )
{
perror("读取文件失败!\n");
break;
}
if( sum > 0 )
{
int m = write(fd, tmp, sum); //m为实际写入的字节数
sum -= m; //n为未写入的字节数
tmp += m; //tmp为未写入的数据缓冲区实际大小
}
}
if(strstr(buf1,".bmp")!=NULL)
{
showbmp(buf1,1);
}
close(src);
close(dst);
display_close(); //关闭显示屏
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <errno.h>
#include <dirent.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <error.h>
#include <strings.h>
#include <signal.h>
#include <pthread.h>
#ifndef MYHEAD_H
#define MYHEAD_H
int dst1; //显示屏驱动
//打开显示屏
int display_open()
{
dst1 = open("/dev/fb0",O_RDWR); //打开显示屏驱动
if(dst1 == -1)
{
printf("显示屏打开失败!\n");
return -1;
}
}
//关闭显示屏
int display_close()
{
close(dst1);
}
bool showbmp(char *bmppath, int n)
{
int w = 0;
int h = 0;
int src1 = open(bmppath , O_RDWR);
lseek(src1, 18 ,SEEK_SET); //获取BMP图片的宽w信息
read(src1, &w, 4);
lseek(src1, 22 ,SEEK_SET); //获取BMP图片的高h信息
read(src1, &h, 4);
char bmpbuf[w*h*3];
int lcdbuf[w*h];
int tempbuf[w*h];
int lcdbuf1[] = {
0};
lseek(src1, 54, SEEK_SET); //跳过BMP图片头信息字节
int rubbish = (4-(w*3)%4)%4; //BMP图片字节不能被4整除时,加入的垃圾字节数
for(int i = 0; i < h; i++)
{
read(src1, &bmpbuf[w*i*3],w*3);
lseek(src1, rubbish, SEEK_CUR); //在字节读入时,跳过垃圾字节
}
for(int i = 0; i < w*h; i++) //将RGB转换成BGR
{
lcdbuf[i] = 0x00<<24 | bmpbuf[i*3+2]<<16 | bmpbuf[i*3+1]<<8 | bmpbuf[i*3];
}
for(int i = 0; i < w; i++)
{
for(int j = 0; j < h; j++)
{
tempbuf[(h-1-j)*w+i] = lcdbuf[j*w+i]; //BMP像素点上下反转
}
}
//内存映射
int *mmap_bmp = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, dst1, 0);
for(int i=0; i<h/n; i++) //图片的高度h / 缩放倍数n
{
for(int j=w*n*i,k=0; j<(w*n*i+w);j+=n,k++) //循环决定每行该取的像素点
{
//任意位置(480-h/n)/2)、(800-w/n)/2)、缩小倍数n
*(mmap_bmp+800*(((480-h/n)/2)+i)+((800-w/n)/2)+k) = tempbuf[j];
}
}
//解除内存映射
munmap(mmap_bmp, 800*480*4);
close(src1);
}
//设置节点
struct node
{
char *data;
struct node *next;
struct node *prev;
};
//初始化链表
struct node *list_init(char *newdata)
{
struct node *head = malloc(sizeof(struct node));
head->data = newdata;
head->next = head;
head->prev = head;
return head;
}
//创建新节点
struct node *newnode(char *newdata)
{
struct node *new = malloc(sizeof(struct node));
new->data = newdata;
new->next = NULL;
new->prev = NULL;
}
//加入新节点
int addnode(struct node *new,struct node *list)
{
struct node *p = list;
while(p->next != list)
{
p = p->next;
}
new->prev = list->prev;
new->next = list;
list->prev = new;
new->prev->next = new;
}
#endif