Socket编程(大文件传输)

server.c

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILE_SERVER_PORT        1234
#define LENGTH_OF_LISTEN_QUEUE  20
#define BUFFER_SIZE             1024
#define FILE_NAME_MAX_SIZE      512

int main(int argc, char **argv)
{
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(FILE_SERVER_PORT);

    int server_socket = socket(AF_INET,SOCK_STREAM,0);
    if(server_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }

    if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
    {
        printf("Server Bind Port : %d Failed!\n",FILE_SERVER_PORT);
        exit(1);
    }

    if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in client_addr;
        socklen_t length = sizeof(client_addr);
        int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
        if(new_server_socket < 0)
        {
            printf("Server Recieve Data Falied!\n");
            break;
        }

        char buffer[BUFFER_SIZE];
        bzero(buffer,sizeof(buffer));
        length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
        if(length < 0)
        {
            printf("Server Recieve Data Failed!\n");
            break;
        }
        char file_name[FILE_NAME_MAX_SIZE + 1];
        bzero(file_name,sizeof(file_name));
        strncpy(file_name,buffer,strlen(buffer) > FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE : strlen(buffer));

        FILE *fp = fopen(file_name,"r");
        if(fp = NULL)
        {
            printf("File :%s Not Found!\n",file_name);
        }
        else
        {
            bzero(buffer,BUFFER_SIZE);
            int file_block_length = 0;
            while((file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp)) > 0)
            {
                printf("file_block_length = %d\n",file_block_length);

                if(send(new_server_socket,buffer,file_block_length,0) < 0)
                {
                    printf("Send file: %s Failed\n",file_name);
                    break;
                }
                bzero(buffer,sizeof(buffer));
            }
        
            fclose(fp);
            printf("File: %s Transfer Finished!\n",file_name);
        }
        close(new_server_socket);
    }
    close(server_socket);
    return 0;
}

 

 

client.c

 

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILE_SERVER_PORT      8080
#define BUFFER_SIZE           1024
#define FILE_NAME_MAX_SIZE    512

int main(int argc, char **argv)
{
    if(argc != 2)
    {
        printf("Usage: %s ServerIPAddress",argv[0]);
        exit(1);
    }
    struct sockaddr_in client_addr;
    bzero(&client_addr,sizeof(client_addr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = htons(INADDR_ANY);
    client_addr.sin_port = htons(0);

    int client_socket = socket(AF_INET,SOCK_STREAM,0);
    if(client_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }

    if(bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
    {
        printf("Client Bind Port Falied!\n");
        exit(1);
    }
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;

    if(inet_aton(argv[1],&server_addr.sin_addr) == 0)
    {
        printf("Server IP address Error!\n");
        exit(1);
    }

    server_addr.sin_port = htons(FILE_SERVER_PORT);
    socklen_t server_addr_length = sizeof(server_addr);

    if(connect(client_socket,(struct sockaddr*)&server_addr,server_addr_length) < 0)
    {
        printf("Can Not Connect To %s !\n",argv[1]);
        exit(1);
    }

    char file_name[FILE_NAME_MAX_SIZE + 1];
    bzero(file_name,sizeof(file_name));
    printf("Please Input File Name On Server.");
    scanf("%s",file_name);

    char buffer[BUFFER_SIZE];
    bzero(buffer,sizeof(buffer));
    strncpy(buffer,file_name,strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));
    send(client_socket,buffer,BUFFER_SIZE,0);

    FILE *fp = fopen(file_name,"w");
    if(fp ==NULL)
    {
        printf("File: %s Can Not Open To Write!\n",file_name);
        exit(1);
    }
    bzero(buffer,sizeof(buffer));
    int length = 0;
    while(length = recv(client_socket,buffer,BUFFER_SIZE,0))
    {
        if(length < 0)
        {
            printf("Revieve Data From Server %d Failed!\n",argv[1]);
            break;
        }
        int write_length = fwrite(buffer,sizeof(char),length,fp);
        if(write_length < length)
        {
            printf("File: %s Write Failed!\n",file_name);
            break;
        }
        bzero(buffer,BUFFER_SIZE);
    }
    
    printf("Recieve file: %s From Derver[%s] Finished!\n",file_name,argv[1]);
    fclose(fp);
    close(client_socket);
    return 0;

}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值