2023/4/21

news/2024/11/29 7:59:41/


1. 将UDP服务器客户端脱离笔记重新搭建(上交)
2. 完成下载上传(上交,必须完成下载,上传尽力完成)

下载客户端

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<sys/stat.h>#define ERR_MSG(msg) do{\fprintf(stderr,"Line:%d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.0.196"  //本机IP
#define PORT 69int main(int argc, const char *argv[])
{//创建套接字int client_fd = socket(AF_INET,SOCK_DGRAM,0);if(client_fd < 0){ERR_MSG("socket");return -1;}printf("socket create success server_fd=%d__%d__\n",client_fd,__LINE__);//填充客户端的地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(PORT);cin.sin_addr.s_addr = inet_addr(IP);//	sockaddr_in addrlen = sizeof(cin);char buf[516] = {0};bzero(buf,sizeof(buf));unsigned short *p1 = (unsigned short*)buf;  		//操作码*p1 = htons(1);char *p2 = buf+2;char filename[128] = "" ;printf("请输入要下载的文件名>>>>>");scanf("%s",filename);getchar();strcpy(p2,filename);  	//要下载的文件名char *p3 = p2+strlen(p2);*p3 = 0;char *p4 = p3+1;strcpy(p4,"octet"); 		//模式char *p5 = p4+strlen(p4);*p5 = 0;int size = 2+1+1+strlen(p2)+strlen(p4);//请求下载ssize_t ret = sendto(client_fd,buf,size,0,(struct sockaddr*)&cin,sizeof(cin)); if(ret < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");socklen_t addrlen = sizeof(cin);//打开文件int fd;ssize_t recv_len;ssize_t res = 0;unsigned short num = 0;while(1){bzero(buf,sizeof(buf));recv_len = recvfrom(client_fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(recv_len < 0){ERR_MSG("recvfrom");return -1;}printf("recvfrom success\n");if(buf[1] == 0x05){fprintf(stderr,"download erro____%d____%s\n",ntohs(*(short*)(buf+2)),buf+4);break;}else if(buf[1] == 0x03)					//此时正常获取到数据包{printf("获取\n");fd = open(filename, O_WRONLY|O_CREAT|O_APPEND, 0666);if(fd < 0){ERR_MSG("open");return -1; }//判断块编号/*	if(*(unsigned short*)(buf+2) == htons(num)){*/printf("kuaibianhao\n");if(write(fd,buf+4,recv_len-4) < 0){ERR_MSG("write");ret = -1;break;}printf("write success\n");buf[1] = 0x04;if(sendto(client_fd,buf,4,0,(struct sockaddr*)&cin,sizeof(cin)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");if(recv_len < 516){break;}close (fd);	}		}printf("下载完成\n");//关闭套接字close(client_fd);return 0;}

UDP服务器


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h>#define ERR_MSG(msg) do{\fprintf(stderr,"Line:%d",__LINE__);\perror(msg);\
}while(0)#define IP "192.168.0.141"  //本机IP
#define PORT 2222int main(int argc, const char *argv[])
{//创建套接字int server_fd = socket(AF_INET,SOCK_DGRAM,0);if(server_fd < 0){ERR_MSG("socket");return -1;}printf("socket create success server_fd=%d__%d__\n",server_fd,__LINE__);//填充服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);//绑定---->>>>>必须绑定if(bind(server_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success __%d__\n",__LINE__);//存储客户端地址信息struct sockaddr_in cin;socklen_t cin_addrlen = sizeof(cin);char ch[128] = "" ;ssize_t res = 0;while(1){bzero(ch,sizeof(ch));//接受数据res = recvfrom(server_fd,ch,sizeof(ch),0,(struct sockaddr*)&cin,&cin_addrlen);if(res < 0){ERR_MSG("recvfrom");return -1;}printf(":%s\n",ch);//发送数据strcat(ch,"*-*");sendto(server_fd,ch,sizeof(ch),0,(struct sockaddr*)&cin,sizeof(cin));}//关闭套接字close(server_fd);return 0;
}

UDP客户端

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define ERR_MSG(msg){\fprintf(stdout,"cline----->%d",__LINE__);\perror(msg);\
}int main(int argc,const char * argv[])
{//1.socketint cfd = socket(AF_INET,SOCK_DGRAM,0);ssize_t sendto_return;ssize_t recvfrom_return;char buf[128];struct sockaddr_in s;s.sin_family = AF_INET;s.sin_port = htons(6666);s.sin_addr.s_addr = inet_addr(argv[1]);int s_len = sizeof(s);while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);//3.sendtosendto_return = sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&s,s_len);if(sendto_return < 0){ERR_MSG("sendto");return -1;}bzero(buf,sizeof(buf));//4.recvfromrecvfrom_return = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *)&s,&s_len);if(recvfrom_return < 0){ERR_MSG("recvfrom");return -1;}printf("客户端收到消息是:%s\n",buf);}close(cfd);return 0;
}


 


http://www.ppmy.cn/news/459463.html

相关文章

2023.04.04

1.终端输入行数&#xff0c;打印金字塔图案 //代码 #include<stdio.h>int main(int argc, const char *argv[]) {int n;printf("请输入行数:\n");scanf("%d", &n);int i,j;i 1;while(i<n){j0;while(j<n-i){putchar( ); //打印前面的空格…

2023.1.4

打印矩阵 #include <iostream>using namespace std; //二维数组的 值传递 void print2D(int a[100][100], int row, int col) {for(int i0; i<row;i){for(int j0; j<col; j)cout << a[i][j] << ;cout <<endl;} }int main() {int a[100][100];in…

2023.4.3 1004

1004 #include <iostream> using namespace std; int main() { int n; cin >> n; while (n--) { int a, b; cin >> a >> b; cout << a b << endl; } return 0; } 1.while (n--)是一个循环语句&#xff0c;它的意思是&#xff1a;先…

线性DP入门笔记(3)超级楼梯 HDU-2041

题目&#xff1a;问题 - 2041 (hdu.edu.cn) 思路&#xff1a;每次只能走一个台阶或两个台阶&#xff0c;那么走到每个台阶所需要的方法应该为前两个台阶方法之和&#xff0c;因此除了边界值&#xff08;前三个台阶方法为 0 1 2&#xff09;&#xff0c;其他台阶正好符合斐波那契…

HLOJ 2041 统计字符个数

输入若干的字符串&#xff0c;每个字符串中只包含数字字符和大小写英文字母&#xff0c;统计字符串中有出现的不同字符的出现次数。 输入格式: 测试数据有多组&#xff0c;处理到文件尾。每组测试输入一个字符串&#xff08;不超过80个字符&#xff09;。 输出格式: 对于每…

HDU 2041

由题目可知&#xff0c;每次只能走一级或两级。 因此从第一级走上第二级只能走一步&#xff0c;只有1种走法。 从第一级走上第三级&#xff0c;可以从第一级直接走两步&#xff0c;也可以从第二级走一步。有2种走法 走上第n级&#xff0c;可以从第n-1级走一步上来&#xff0c;也…

差分思想(2041. 干草堆)

差分是一种算法。 先看AcWing上的一道题目↓ 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉&#xff0c;她同意帮助农夫约翰把一批新到的干草捆堆起来。 开始时&#xff0c;共有 N 个空干草堆&#xff0c;编号 1∼N。 约翰给贝茜下达了 K 个指令&#xff0c;每条指令的格…

HDoj:2041 超级楼梯(C语言)

这个题先一步步的计算一下&#xff0c;算出几项数据之后你就会发现这个计算结果的规律就是斐波那契数列的规律&#xff0c;所以定义一个数组&#xff0c;按照斐波那契数列的规律填数就可以了。 下面附上AC的C语言代码&#xff1a; #include<stdio.h>int main(){ int…