tcp作业, tcp发送图片到开发板, 并控制显示

本文介绍了一个在Ubuntu系统中通过命令行控制开发板显示图片的解决方案。利用server.c和client.c两个程序实现图片的发送和接收,同时支持全屏、半屏和双倍放大显示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.要求: 在Ubuntu上用命令控制开发板图片显示
    full命令--》全屏显示
    half命令--》1/2显示
    double命令 两倍显示
2. server.c

#include <sys/socket.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <error.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/sendfile.h>


 
#define SPORT 8888	// >1024

int main(int argc,char **argv) 
{
	int sfd, newsfd;
	int fd;
	int fsize;
	struct sockaddr_in saddr4;
	struct stat stat;
	char sbuf[50];
	
	// 创建套接字(IPV4 TCP)
	sfd = socket(AF_INET, SOCK_STREAM, 0);

	// 设置套接字IP可复用
	const int bReuseaddr = 1;
	setsockopt(sfd,SOL_SOCKET ,SO_REUSEADDR,(const void*)&bReuseaddr,sizeof(bReuseaddr));

	// 设置套接字发送缓冲区为32k (默认为8k)
	const int nSendBuf = 32 * 1024;//设置为32K
	setsockopt(sfd,SOL_SOCKET,SO_SNDBUF,(const void*)&nSendBuf,sizeof(int));

	// 绑定服务端地址
	memset(&saddr4, 0, sizeof(saddr4));
	saddr4.sin_family 		= AF_INET;
	saddr4.sin_port  		= htons(SPORT);
	saddr4.sin_addr.s_addr  = inet_addr ("192.168.0.101");
	if (0 < bind(sfd, (struct sockaddr *)&saddr4, sizeof(saddr4))) {
		perror("bind err");
		return -1;
	}
		
	// 监听
	listen(sfd, 5);

	
	// 打开文件
	fd = open(argv[1], O_RDONLY);
	if (fd == -1) {
		printf("open %s err\n", argv[1]);
		perror("");
		return -1;
	}
	// 获取文件大小
	fstat(fd, &stat);
	fsize = stat.st_size;
	printf("fsize = %d\n", fsize);
	
	// 接收(阻塞接口, 等待连接后才可监听)
	newsfd = accept(sfd, NULL, NULL);
	printf("accept ok\n");
	
	
	printf("input enter send filesize\n");
	getchar();
	// 告诉客户端即将发送的文件有多大
	bzero(sbuf, sizeof(sbuf));
	sprintf(sbuf, "%d", fsize);
	send(newsfd, sbuf, strlen(sbuf), 0);

	printf("input enter send file\n");
	getchar();
	// 发送文件
	if (0 > sendfile(newsfd, fd, 0, fsize)){
		perror("sendfile err\n");
		return -1;
	}

	printf("enter cmd\n");
	// 发送命令
	while(1) {
		bzero(sbuf, sizeof(sbuf));
		fgets(sbuf, sizeof(sbuf), stdin);
		send(newsfd, sbuf, strlen(sbuf), 0);
	}
	
	
	return 0;
}

3.client.c

#include <sys/socket.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <error.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <fcntl.h>

#include "../include/pic/pic.h"
#include "../include/pic/bmp.h"
#include "../include/pic/fb.h"
#include "../include/conf.h"

#define CPORT 7777	// >1024
#define SPORT 8888	// >1024
#define RecvBufSize 32 * 1024


void show_pic_(int cfd, const char *pic_path)
{
	int ret;
	char cbuf[50];		// 接收命令的buf
	bitmap_t bitmap;
	bitmap_t zoombm;
	fbdev_t fbdev;
	int i, j=0;
	
	memset(&bitmap, 0, sizeof(bitmap));
	memset(&fbdev, 0, sizeof(fbdev));
	ret = open_fb_device("/dev/fb0", &fbdev);
	
	//print_dev_info(&fbdev);
	
	ret = get_bitmap_from_bmpfile(pic_path, &bitmap);

	while (1) {
		bzero(cbuf, sizeof(cbuf));
		CUR;
		ret = recv(cfd, cbuf, sizeof(cbuf), 0);
		printf("ret = %d\n", ret);
		printf("cbuf = %s\n", cbuf);
		CUR;
		fb_clear_screen(&fbdev, 0x000000);
		if (!strncmp(cbuf, "full", 4)) {
			CUR;
			merge_bitmap_to_fbdev(&fbdev, 0, 0, &bitmap);
		}
		else if (!strncmp(cbuf, "half", 4)){
			CUR;
			memset(&zoombm, 0, sizeof(zoombm));
			zoom(&bitmap, &zoombm, 0.5);
			merge_bitmap_to_fbdev(&fbdev, 0, 0, &zoombm);
			free_bitmap(&zoombm);
		}
		else if (!strncmp(cbuf, "double", 6)){
			CUR;
			memset(&zoombm, 0, sizeof(zoombm));
			zoom(&bitmap, &zoombm, 2);
			merge_bitmap_to_fbdev(&fbdev, 0, 0, &zoombm);
			free_bitmap(&zoombm);
		}
		//free_bitmap(&bitmap);
		//close_fb_dev(&fbdev);
	}
	
	
	
}




int main(int argc,char **argv) 
{
	int cfd;
	struct sockaddr_in caddr4;	// 客户端进程地址
	struct sockaddr_in saddr4;	// 服务端进程地址
	int fsize;
	char tbuf[50];
	char rbuf[RecvBufSize];
	int newfile_fd;
	int ret, cnt = 0;
	
	// 创建套接字(IPV4 TCP)
	cfd = socket(AF_INET, SOCK_STREAM, 0);

	// 设置套接字IP可复用
	const int bReuseaddr = 1;
	setsockopt(cfd,SOL_SOCKET ,SO_REUSEADDR,(const void*)&bReuseaddr,sizeof(bReuseaddr));

	// 设置套接字接收缓冲区为32k (默认为8k)
	const int nRecvBuf = RecvBufSize;	//设置为32K
	setsockopt(cfd,SOL_SOCKET,SO_SNDBUF,(const void*)&nRecvBuf,sizeof(int));

	// 客户端不用绑定。 因为调用connect时, 如果服务端套接字sockfd没有绑定到一个地址,系统会给sockfd绑定一个未使用的默认地址
	
	// 连接客户端
	saddr4.sin_family 		= AF_INET;
	saddr4.sin_port  		= htons(SPORT);
	saddr4.sin_addr.s_addr  = inet_addr ("192.168.0.101");
	if (-1 == connect(cfd, ((struct sockaddr *)&saddr4), sizeof(saddr4))){
		perror("connect err");
		return -1;
	}
	printf("connect serverIp 192.168.0.101 ok\n");

	// 接收文件的大小信息
	bzero(tbuf, sizeof(tbuf));
	recv(cfd, tbuf, sizeof(tbuf), 0);
	fsize = (int)strtoul(tbuf, NULL, 0);
	printf("fsize = %d\n", fsize);

	// 创建一个新文件来存取数据
	newfile_fd = open("new.bmp", O_CREAT | O_RDWR);
	if (newfile_fd == -1) {
		perror("creat new.bmp err");
	}
		// 将文件截断为0
		ftruncate(newfile_fd, 0);
	int i;
	// 接收文件
	while(1) {
		bzero(rbuf, sizeof(rbuf));
		if (cnt < fsize)
			ret = recv(cfd, rbuf, sizeof(rbuf), 0);
		else {
			printf("recved finish\n");
			goto show_pic;
		}
		if (ret == 0) {
			printf("disconnect\n");
			return -1;
		}
		else if(ret < 0){
			printf("recv err\n");
			close(cfd);
			close(newfile_fd);
			return -1;
		}
		else {	// 正常接收
			printf("ret = %d\n", ret);
			//printf("recved %s\n", rbuf);
			if (0 > write(newfile_fd, rbuf, ret)){	// 接收到的数据写入文件
				perror("write err");
				return -1;
			}
			cnt += ret;
		}
	}
show_pic:
	printf("show pic\n");
	close(newfile_fd);
	show_pic_(cfd, "new.bmp");
	return 0;
}

 

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值