day4 网络编程

day4 网络编程_第1张图片

#include
#define SER_PORT 69
#define SER_IP "192.168.122.96"
int download(int cfd,struct sockaddr_in sin)
{
	//向服务器发送下载请求
	char buf[512] = "";
	//组装请求数据
	short *p1 = (short *)buf;
	*p1 = htons(1);
	char *p2 = buf+2;
	strcpy(p2, "1_armcli.c");
	char *p3 = p2+strlen(p2)+1;
	strcpy(p3, "octet");
	int len = 4+strlen(p2) + strlen(p3);   //要发送的长度
	sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	// 获取服务器的临时端口
	struct sockaddr_in asin;
	socklen_t addrlen = sizeof(asin);
	int fd=-1;
	if ((fd = open("./text.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664)) ==-1)
	{
		perror("open error");
		return -1;
	}
	char abuf[516]="";
	char cbuf[4]="";
	while(1)
	{
		bzero(abuf,sizeof(abuf));
		int res=recvfrom(cfd,abuf,sizeof(abuf),0,(struct sockaddr*)&sin,sizeof(sin));
		int datatype=ntohs(*(short*)abuf);
		int filebig=res-4;
		printf("%d\n",filebig);
		if(datatype==3)
		{
			write(fd,abuf+4,filebig);
			//发送ACK
			char x=abuf[2];
			char y=abuf[3];
			bzero(abuf,sizeof(abuf));
			cbuf[0]=0x00;
			cbuf[1]=0x04;
			cbuf[2]=x;
			cbuf[3]=y;
			sendto(cfd,cbuf,4,0,(struct sockaddr*)&asin,&addrlen);
			if(filebig<512)
			{
				printf("下载成功\n");
				break;
			}
		}
	}
	return 0;
}
int up(int cfd,struct sockaddr_in sin)
{
	//向服务器发送上传请求
	char buf[516] = "";
	//组装请求数据
	short *p1 = (short *)buf;
	*p1 = htons(2);
	char *p2 = buf+2;
	strcpy(p2, "z.c");
	char *p3 = p2+strlen(p2)+1;
	strcpy(p3, "octet");
	int len = 4+strlen(p2) + strlen(p3);   //要发送的长度
	sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	// 获取服务器的临时端口
    struct sockaddr_in asin;
    socklen_t addrlen = sizeof(asin);
	bzero(buf,sizeof(buf));
	recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&asin,&addrlen);
	int fd=-1;
	if((fd=open("./z.c",O_RDONLY))==-1)
	{
		perror("open error:");
		return -1;
	}
}
int main(int argc, const char *argv[])
{
	//1、创建用于通信的套接字文件描述符
	int cfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(cfd == -1)
	{
		perror("socket error");
		return -1;
	}
	//2、绑定(可选)

	//3、填充服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);
	char menu;
	while(1)      
	{
		printf("\t\t=====1、下载=====\n");
		printf("\t\t=====2、上传=====\n");
		printf("\t\t=====0、退出=====\n");
		printf("请输入功能选项:");
		scanf("%c", &menu);
		//吸收垃圾字符
		while(getchar() != '\n');    
		switch(menu)
		{
		case '1':
			{
				download(cfd,sin);
			}
			break;
		case '2':
			{
				up(cfd,sin);
			}
			break;
		case '0':
			exit(EXIT_SUCCESS);          
		default:
			printf("您输入的功能有误请重新输入!!!\n");
		}
		printf("请输入任意键按回车清屏!!!\n");
		//吸收垃圾字符
		while(getchar() != '\n');
		system("clear");             
	}
	return 0;
}

你可能感兴趣的:(网络)