周三的作业

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
#define ERR_MSG(msg) do{\
    fprintf(stderr,"__%d__",__LINE__);\
    perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
    if(argc<2)
    {
        fprintf(stderr,"请输入IP\n");
        return -1;
    }
    //将获取到的端口字符串,转换成整形
/*    int port=atoi(argv[2]);
    if(port<1024||port>49151)
    {
        fprintf(stderr,"PORT %d input error! 1024-49151",port);
        return -1;
    }*/
    //创建报式套接字
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        ERR_MSG("socket");
        return -1;
    }
    //填充服务器IP地址以及端口:
    struct sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(69);
    sin.sin_addr.s_addr=inet_addr(argv[1]);
    //绑定服务器地址信息结构体
/*    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)<0))
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("绑定成功");
        struct sockaddr_in cin; //存储接收到的数据包来自哪里
        socklen_t addrlen=sizeof(cin);

        char buf[128]="";
        while(1)
    {
        bzero(buf,sizeof(buf));
    //接收
        if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("[%s : %d]:%s",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
    //发送
    }*/    
        

        //发送下载请求
    char name[20]="";
    printf("请输入文件名:");
    scanf("%s",name);
    char buf[128]="";
    char* ptr=buf;
    short int* pa=(short int*)ptr;
    *pa=htons(1);
    char* pb=ptr+2;
    strcpy(pb,name);
    char* pc=pb+strlen(pb);
    *pc=0;
    char* pd=pc+1;
    strcpy(pd,"octet");
    ssize_t size=2+strlen(pb)+1+strlen("octet")+1;
    if(sendto(sfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("sendto");
        return -1;
    }
    printf("sendto success\n");
    struct sockaddr_in rcv_addrmsg;   //存储接收到的数据包来自哪里
    socklen_t addlen=sizeof(rcv_addrmsg);
    printf("fasf");
    short ACK[4] = {0};
    unsigned short code=0;
    char text[516]={0};
    unsigned short number=0;
    int number1=0;
    ssize_t res=0;
    int fa=open("./new.png",O_RDWR|O_TRUNC|O_CREAT,0777);
    if(fa<0)
    {
        ERR_MSG("open");
        return -1;
    }
    printf("打开成功");
    int num = 1;
    while(1)
    {
        ssize_t res=0;
        //bzero(buf,sizeof(buf));
        bzero(text,sizeof(text));
        res=recvfrom(sfd,text,sizeof(text),0,(struct sockaddr*)&rcv_addrmsg,&addlen);
        if(res<0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("%d %d\n",*(short*)text, *(short*)text+2);
    code=htons(4);
    number=htons(num++);
    write(fa, text+4, res - 4);
    if(res < 512)
        break;
    ACK[0] = code;
    ACK[1] = number;
    //*(unsigned char*)ACK=htons(4);
    //*(unsigned short*)(ACK+2)=htons(number);
    if(sendto(sfd,ACK,4,0,(struct sockaddr*)&rcv_addrmsg,sizeof(rcv_addrmsg))<0)
    {
        ERR_MSG("sendto");
        return -1;
    }
    //printf("success");
    }
    
    //关闭套接字
    close(sfd);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值