编写一个基于TCP的文件收发软件,用来将文件发送给开发板。如果发送的是图片,则显示到开发板的屏幕上。

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

具体代码如下:

电脑端:

/*
	客户端部分:
*/
#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

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/108506610