Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65361
  • 博文数量: 50
  • 博客积分: 2360
  • 博客等级: 大尉
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-02 15:59
文章分类

全部博文(50)

文章存档

2011年(1)

2009年(49)

我的朋友

分类: LINUX

2009-07-22 20:59:04

#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])

{
    int sockfd;
    int fd,readLen=0;
    struct sockaddr_in srvaddr;
    unsigned short port = 69;
    socklen_t addrlen = sizeof(srvaddr);
    char *filename = argv[1];
    char requ_buf[512] = "";
    char back_buf[516] = "";
    char send_buf[516] = "";
    char file_buf[512] = "";
    
    srvaddr.sin_family = AF_INET;
    srvaddr.sin_port = htons(port);
//    srvaddr.sin_addr.s_addr = inet_addr("192.168.220.99");
    inet_pton(AF_INET,"192.168.220.99",&srvaddr.sin_addr.s_addr);
   
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        perror("Invalid socket");
        exit(1);
    }
    if((fd = open(filename, O_RDWR)) < 0 )
    {
        perror("File not found");
        exit(1);
    }
    sprintf(requ_buf, "%c%c%s%c%s%c",0,2,filename,0,"octet",0);//构造请求报文,申请向服务器写数据
    sendto(sockfd,requ_buf,512,0,(struct sockaddr*)&srvaddr, sizeof(struct sockaddr));//发送请求报文
    recvfrom(sockfd, back_buf,516,0,(struct sockaddr*)&srvaddr,&addrlen);    //保存 服务器返回的 回应 到back_buf中(返回ACK)
   
    if(back_buf[1]==4)
    {
        int i=1;
        while(1)
        {
            memset(file_buf,0,512);
            memset(back_buf,0,50);
            readLen=read(fd,file_buf,512);//读取要上传的文件fd中512K大小的内容到file_buf中
            sprintf(send_buf,"%c%c%c%c%s%",0,3,0,(char)i,file_buf);//构造 要发送的数据包
            sendto(sockfd,send_buf,516,0,(struct sockaddr *)&srvaddr,addrlen);//通过socked 把数据包发送到 服务器
            if(readLen<512)//如果本此发送的数据包大小小于512K 则表示数据发送完毕 退出循环
                break;
            recvfrom(sockfd,back_buf,516,0,(struct sockaddr *)&srvaddr,&addrlen);//保存 服务器返回的 回应 到back_buf中
            if(back_buf[3]==send_buf[3])//判断返回的块编号是否与发送的块编号相等
                i++;//相等 则继续发送下一个大小小于512K 的数据包
            else
                printf("Error Info:%s\n",back_buf[5]);//服务器没有接到发送的数据包时 打印服务器返回的信息
        }
        close(sockfd);
        close(fd);
    }
    return 0;
}


 
阅读(258) | 评论(0) | 转发(0) |
0

上一篇:键盘常用键ASCII码

下一篇:select 实例

给主人留下些什么吧!~~