#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <arpa/inet.h>
#define MSG_ERR(msg)do{\
fprintf(stderr,"line:%d",__LINE__);\
perror(msg);\
return -1;\
}while(0)
#define PORT 69//端口号
#define IP "192.168.8.130"
int main(int argc, const char *argv[])
{
//创建套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
MSG_ERR("socket");
//服务器的IP和端口
struct sockaddr_in sin;
sin.sin_family=AF_INET;//IPV4
sin.sin_port=htons(PORT);//端口
sin.sin_addr.s_addr=inet_addr(IP);//IP
char wribuf[128]="";
unsigned short* pa=(unsigned short*)&wribuf;
*pa=htons(2);//操作码:2
char *pb=wribuf+2;
strcpy(pb,argv[1]);//文件名:argv[1]
char *pc=pb+strlen(pb);//偏移位置
*pc=0;//0
char *pd=pc+1;
strcpy(pd,"octet");//模式
int size;
size=2+strlen(pb)+1+strlen(pd)+1;//大小
//向服务器发送写请求
if(sendto(sfd,wribuf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
MSG_ERR("sendto");
struct sockaddr_in cin;
//cin.sin_family=AF_INET;
//cin.sin_addr.s_addr = inet_addr(IP);
size=sizeof(cin);
char buf[128]="";
//在当前目录下打开文件
strcat(buf,"./");
//命令行读取参数
strcat(buf,argv[1]);
//以读写方式打开
int fd=open(buf,O_RDONLY,0666);
if(fd<0)
MSG_ERR("open");
char databuf[600]="";
unsigned short b=1;
ssize_t res2=0;
ssize_t res=0;
char buf1[128]="";
while(1)
{
bzero(databuf,sizeof(databuf));
if(recvfrom(sfd,buf1,sizeof(buf1),0,(struct sockaddr*)&cin,&size)<0)
MSG_ERR("recvfrom");
res=read(fd,databuf+4,512);
if(res<0)
MSG_ERR("read");
printf("%ld\n",res);
*(unsigned short int*)databuf=htons(3);
*(unsigned short int *)(databuf+2)=htons(b);
res2=sendto(sfd,databuf,res+4,0,(struct sockaddr*)&cin,sizeof(cin));
if(res2<0)
MSG_ERR("sendto");
printf("%ld----\n",res2);
b++;
if(res<512)
{
printf("数据上传完毕\n");
break;
}
}
close(sfd);
close(fd);
return 0;
}
网络编程TFTP上传作业
最新推荐文章于 2025-07-29 19:43:47 发布