网络编程Demo, 下载文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shizheng163/article/details/83545600

将以前一篇Demo调整下格式, 另外此代码不完善, 仅做网络通讯API测试Demo, 客户端接收数据有BUG,可能因为发送端发送太快, 以及接收端接收字节数量不对引起。
另外发现同一机器做测试Socket通讯数据为内存拷贝, 会导致原发送的文件大小有变化,变化数量跟实际发送的数据大小有关。

客户端代码

#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#define BUFF_SIZE 100
int main(int argv,char *args[]){
    int servsock;
    struct sockaddr_in servaddr;
    if(argv!=3){
        printf("Usage:%s <ip><port>\n",args[0]);
        exit(1);
    }
    servsock = socket(PF_INET,SOCK_STREAM,0);
    if(servsock == -1)
    {
        printf("socket() error\n");
        exit(1);
    }
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(args[1]);
    servaddr.sin_port = htons(atoi(args[2]));
    if(connect(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1)
    {
        printf("connect() error. %s:%s\n", args[1], args[2]);
        exit(1);
    }else{
        printf("connected.....%s:%s\n", args[1], args[2]);
    }
    printf("please input filename:");
    char filename[BUFF_SIZE];
    memset(filename,0,sizeof(char)*BUFF_SIZE);
    scanf("%s",filename);
    write(servsock,filename,strlen(filename));
    int successFlag;
    read(servsock,&successFlag,sizeof(successFlag));
    if(successFlag!=1){
        printf("input file is not existed!\n successFlag is %d\n",successFlag);
        exit(1);
    }else{
        FILE *fp = fopen(filename,"w");
        while(1){
            memset(filename,0,BUFF_SIZE);
            int revlen = read(servsock,filename,BUFF_SIZE);
            if(revlen ==0)
                break;
            fputs(filename,fp);
        }
        fclose(fp);
        printf("complete!\n");
    }
    close(servsock);
    return 0;
}

服务端代码

#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#define MAX_SEND_LENGTH 65536
int main(int argv,char *args[]){
    int servsock,clntsock;
    struct sockaddr_in servaddr,clntaddr;
    if(argv!=2){
        printf("Usage:%s <port>\n", args[0]);
        exit(1);
    }
    servsock = socket(PF_INET,SOCK_STREAM,0);
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(atoi(args[1]));
    if(bind(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr)) ==-1)
    {
        printf("bind() error\n");
        exit(1);
    }

    if(listen(servsock,5) ==-1)
    {
        printf("listen() error  %s\n", args[1]);
        exit(1);
    }
    else
    {
        printf("socket listen to %s\n", args[1]);
    }
    socklen_t len = sizeof(clntaddr);
    clntsock = accept(servsock, (struct sockaddr*)&clntaddr, &len);
    char filename[100];
    memset(filename, 0, 100);
    read(clntsock, filename, 100);
    printf("receiver filename is: %s\n",filename);
    FILE *fp = fopen(filename, "r+b");
    int successFlag = 1;
    if(!fp)
    {
        successFlag = 0;
        write(clntsock, &successFlag, sizeof(successFlag));
        printf("NULL\n");
        close(clntsock);
        close(servsock);
        return 0;
    }
    write(clntsock, &successFlag, sizeof(successFlag));
    fseek(fp, 0, SEEK_END);
    uint32_t uDataLen = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    printf("will be send data: %s, len = %u Byte\n", filename, uDataLen);

    uint8_t * ptempFileData = new uint8_t[uDataLen];
    uint8_t * pSendBuffer   = new uint8_t[uDataLen];
    fread(ptempFileData, 1, uDataLen, fp);
    memcpy(pSendBuffer, ptempFileData, uDataLen);
    delete ptempFileData;

    uint32_t cursor = 0;
    while(cursor < uDataLen)
    {
        uint32_t sendLen = uDataLen - cursor;
        if(sendLen > MAX_SEND_LENGTH)
            sendLen = MAX_SEND_LENGTH;
        cursor += sendLen;
        write(clntsock, pSendBuffer +  cursor, sendLen);
        printf("sent length: %d Byte\n", cursor);
    }

    printf("sent complete: %d Byte\n", uDataLen);
    fclose(fp);
    delete pSendBuffer;
    close(clntsock);
    close(servsock);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shizheng163/article/details/83545600
今日推荐