嵌入式学习day35

day34练习:

1. 用udp实现文件传输,服务器给客户端发文件

client.c

#include "head.h"

int main(int argc, const char *argv[])
{
	int clifd = socket(AF_INET,SOCK_DGRAM,0);
	if (clifd < 0)
	{
		perror("socket fail");
		return -1;
	}

	printf("Input filename");
	char filename[1024];
	fgets(filename,sizeof(filename),stdin);
	filename[strlen(filename) - 1] = '\0';

	struct sockaddr_in seraddr;
	bzero(&seraddr,sizeof(seraddr));
	seraddr.sin_family = AF_INET;
	seraddr.sin_port = htons(50000);
	seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	sendto(clifd,filename,strlen(filename)+1,0,(const struct sockaddr*)&seraddr,sizeof(seraddr));

	int fd_d = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);
	if (fd_d < 0)
	{
		perror("open fail");
		return -1;
	}

	while (1)
	{
		char buf[1024] = {0};
		int ret = recvfrom(clifd,buf,sizeof(buf),0,NULL,NULL);
		if (strncmp(buf,".quit",5) == 0)
			break;
		write(fd_d,buf,ret);
	}
	close(fd_d);
	close(clifd);
	return 0;
}

server.c

#include "head.h"

int main(int argc, const char *argv[])
{
	int serfd = socket(AF_INET,SOCK_DGRAM,0);
	if (serfd < 0)
	{
		perror("socket fail");
		return -1;
	}

	struct sockaddr_in seraddr;
	bzero(&seraddr,sizeof(seraddr));
	seraddr.sin_family = AF_INET;
	seraddr.sin_port = htons(50000);
	seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if (bind(serfd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
	{
		perror("bind fail");
		return -1;
	}

	char filename[1024];
	struct sockaddr_in cliaddr;
	bzero(&cliaddr,sizeof(cliaddr));
	socklen_t len = sizeof(cliaddr);
	recvfrom(serfd,filename,sizeof(filename),0,(struct sockaddr*)&cliaddr,&len);
	printf("filename = %s\n",filename);

	int fd_s = open(filename,O_RDONLY);
	if (fd_s < 0)
	{
		perror("open fail");
		return -1;
	}

	while (1)
	{
		char buf[1024] = {0};
		int ret = read(fd_s,buf,sizeof(buf));
		if (ret == 0)
		{
			sendto(serfd,".quit",5,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
			break;
		}
		sendto(serfd,buf,ret,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
	}
	close(fd_s);
	close(serfd);
	return 0;
}

2. 用udp实现客户端和服务器点对点聊天

client.c

#include "../head.h"

int res_fd;

void do_handler (int signo)
{
	printf("exit...\n");
	close(res_fd);
	exit(0);
}

int main(int argc, const char *argv[])
{
	//1.socket 
	int fd = socket(AF_INET,SOCK_DGRAM,0);
	if (fd < 0)
	{
		perror("socket fail");
		return -1;
	}

	// Initialize server address once (optimization from server.c pattern)
	struct sockaddr_in seraddr;
	bzero(&seraddr,sizeof(seraddr));
	seraddr.sin_family = AF_INET;
	seraddr.sin_port = htons(50000);
	seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	// Send initial connection message to server
	char buf[1024] = "Client connected";
	sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&seraddr,sizeof(seraddr));

	pid_t pid = fork();

	if (pid < 0)
	{
		perror("fork fail");
		return -1;
	}

	if (pid > 0)
	{
		res_fd = fd;
		signal(SIGUSR1,do_handler);
		while (1)
		{
			printf("> ");
			fgets(buf,sizeof(buf),stdin);
			sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&seraddr,sizeof(seraddr));
			if (strncmp(buf,"quit",4) == 0)
			{
				kill(pid,SIGUSR1);
				wait(NULL);
				close(fd);
				exit(0);
			}
		}
	}else if (pid == 0)
	{
		res_fd = fd;
		signal(SIGUSR1,do_handler);
		while (1)
		{
			recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
			printf("cli buf: %s\n",buf);
			if (strncmp(buf,"quit",4) == 0)
			{
				kill(getppid(),SIGUSR1);
				close(fd);
				exit(0);
			}
		}
	}
	
	return 0;
}

server.c

#include "../head.h"


int res_fd;

void do_handler (int signo)
{

	printf("exit...\n");
	close(res_fd);
	exit(0);
}


int main(int argc, const char *argv[])
{
	//1.socket 
	int fd = socket(AF_INET,SOCK_DGRAM,0);
	if (fd < 0)
	{
		perror("socket fail");
		return -1;
	}

	//2bind 
	struct sockaddr_in seraddr;
	bzero(&seraddr,sizeof(seraddr));
	seraddr.sin_family = AF_INET;
	seraddr.sin_port = htons(50000);
	seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if (bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
	{
		perror("bind fail");
		return -1;
	}

	char buf[1024];
	//3.recvfrom 
	struct sockaddr_in cliaddr;
	bzero(&cliaddr,sizeof(cliaddr));
	socklen_t len = sizeof(cliaddr);
	recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&cliaddr,&len);
	printf("ser buf: %s\n",buf);

	pid_t pid = fork();

	if (pid < 0)
	{
		perror("fork fail");
		return -1;
	}

	if (pid > 0)
	{
		res_fd  = fd;
		signal(SIGUSR1,do_handler);
		while (1)
		{
			printf("> ");
			fgets(buf,sizeof(buf),stdin);
			sendto(fd,buf,strlen(buf)+1,0,(const struct sockaddr *)&cliaddr,sizeof(cliaddr));
			if (strncmp(buf,"quit",4) == 0)
			{
				kill(pid,SIGUSR1);
				wait(NULL);
				close(fd);
				exit(0);
			}
		}
	}else if (pid == 0)
	{
		res_fd  = fd;
		signal(SIGUSR1,do_handler);
		while (1)
		{
			recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
			printf("ser buf: %s\n",buf);
			if (strncmp(buf,"quit",4) == 0)
			{
				kill(getppid(),SIGUSR1);
				close(fd);
				exit(0);
			}
		}
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值