1. 程式人生 > >網路程式設計Demo, 下載檔案。

網路程式設計Demo, 下載檔案。

將以前一篇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;
}