day03-网络编程
1>TCP机械臂测试
#include<myhead.h>
#define SER_IP "10.211.55.11"
#define SER_PORT 8888
#define CLI_IP "10.211.55.9"
#define CLI_PORT 6666
//客户端
int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); //3//将端口号快速重用(设置广播/组播)int reuse = 1;if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1)PRINT_ERR("");printf("端口号快速重用成功\n");
/*//2、绑定(非必须)//2.1struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//2.2if((bind(cfd,(struct sockaddr*)&cin,sizeof(cin))) == -1)PRINT_ERR("");*///3、连接服务器//3.1填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //地址族sin.sin_port = htons(SER_PORT); //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址//3.2 连接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//4、数据收发char rbuf[5]={0xff,0x02,0x00,0x00,0xff};unsigned char bbuf[5]={0xff,0x02,0x01,0x00,0xff};//初始化send(cfd,rbuf,sizeof(rbuf),0);sleep(1);send(cfd,bbuf,sizeof(bbuf),0);char key = 0; //接收字符while(1){scanf("%c",&key);if(key == '\n')continue;getchar();switch (key){case 'W':case 'w':{rbuf[3]+=5;if(rbuf[3]>=90)rbuf[3]=90;send(cfd,rbuf,sizeof(rbuf),0);}break;case 'S':case 's':{rbuf[3]-=5;if(rbuf[3]<=-90)rbuf[3]=-90;send(cfd,rbuf,sizeof(rbuf),0);}break;case 'D':case 'd':{bbuf[3]+=5;if(bbuf[3]>=180)bbuf[3]=180;send(cfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]-=5;if(bbuf[3]>=180)bbuf[3]=0;send(cfd,bbuf,sizeof(bbuf),0);}break;default:printf("输入错误,请重新输入\n");break;}}//5、关闭套接字close(cfd);return 0;
}
2>基于UDP的TFTP文件传输
#include<myhead.h>
#define SER_IP "10.211.55.11"
#define SER_PORT 69//客户端
void menu()
{printf("*************************\n");printf("*\t 1.下载 \t*\n");printf("*\t 2.上传 \t*\n");printf("*\t 0.退出 \t*\n");printf("*************************\n");
}
int rev(int choice)
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); ////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); //ip地址socklen_t socklen = sizeof(sin);//3、收发数据char pack[516] = "";char ack[4];//校验收到的块编号int N = 0;char filename[128]="";printf("请输入要下载的文件名:");scanf("%s",filename);//组件协议包:下载请求short *p1 = pack;*p1 = htons(choice); //设置操作码char *p2 = p1+1;strcpy(p2, filename); //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet"); //模式位int packlen = 4+strlen(p2) + strlen(p4); //请求包的大小//向服务器发送请求包sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));p1=NULL;free(p1);p2=NULL;free(p2);p4=NULL;free(p4);//建立文件int fd = -1;if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)PRINT_ERR("");while(1){bzero(pack, sizeof(pack));//收取服务器发来的数据包int ret=recvfrom(cfd, pack, sizeof(pack), 0, (struct sockaddr*)&sin, &socklen);//获取发送来的操作码short *p=pack;short code = ntohs(*p);//获取发送来的块编号short num = ntohs(*(p + 1));
// printf("%d %d %d\n",code,num,ret);write(fd,pack+4,ret-4);//判断数据包的是否为3 以及 数据包数据内容是否为512if(3 == code && num == N + 1){N++;//如果为512,则读取后,回复一个应打包,继续接收下一个// 组装ACKshort *a=ack;*a = htons(4);*(a + 1) = htons(num);sendto(cfd, ack, 4, 0, (struct sockaddr*)&sin, sizeof(sin));if(ret<512){printf("下载完成!\n");break;}}}//5、关闭套接字close(cfd);}int snd(int choice)
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); //3//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); //ip地址socklen_t socklen = sizeof(sin);//3、收发数据char pack[516] = "";char ack[4];char filename[128]="";printf("请输入要上传的文件名:");scanf("%s",filename);//组件协议包:下载请求short *p1 = pack;*p1 = htons(choice); //设置操作码char *p2 = p1+1;strcpy(p2, filename); //文件名char *p4 = p2 + strlen(p2) + 1;strcpy(p4, "octet"); //模式位int packlen = 4+strlen(p2) + strlen(p4); //请求包的大小//向服务器发送请求包sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));p1=NULL;free(p1);p2=NULL;free(p2);p4=NULL;free(p4);int ret = 0;//打开文件int fd = -1;if((fd=open(filename,O_RDONLY)) == -1)PRINT_ERR("");char rbuf[512]="";while(1){//收取服务器发来的ackrecvfrom(cfd, ack, 4, 0, (struct sockaddr*)&sin, &socklen);//获取发送来的操作码short *a=ack;short code = ntohs(*a);//获取发送来的块编号short num = ntohs(*(a + 1));// printf("%d %d \n",code,num);if(4 == code && (ret = read(fd,rbuf,sizeof(rbuf)))>0){bzero(pack, sizeof(pack));short *p1 = pack;*p1 = htons(3);short *p2 = p1 + 1;*p2 = htons(num+1);short *p4 = p2 + 1;strcpy(p4, rbuf); //模式位packlen=4+strlen(rbuf);
// printf("%d %d \n",num,packlen);sendto(cfd, pack, packlen, 0, (struct sockaddr*)&sin, sizeof(sin));}else{printf("上传完成!\n");break;}}//5、关闭套接字close(cfd);
}int main(int argc, const char *argv[])
{int choice = 0;while (1){menu();printf("请输入操作:");scanf("%d",&choice);switch (choice){case 1: rev(choice);break;case 2: snd(choice);break;case 0: exit(0);break;default:printf("输入错误,请重新输入\n");break;}getchar();getchar();system("clear");}return 0;
}