5.4 收发文件的服务器端/客户端实现

本文介绍了一个使用C++11在Ubuntu 16.04上实现的简单文件收发系统。客户端接收用户输入的文件名,请求服务器传输对应文件。若文件不存在,服务器不会传输,客户端仍创建空文件。代码示例包括服务器端和客户端,文件传输仅支持一次请求。文件名的安全检查应在服务器端进行,客户端利用<regex>库进行初步验证。编译C++11代码需使用g++ -std=c++11命令。
摘要由CSDN通过智能技术生成

程序需求

  1. 客户端接受用户输入的传输文件名
  2. 客户端请求服务器端传输该文件名所指文件

补充说明

  1. 当指定文件不存在的时候,服务器端不传输文件,客户端仍生成一个无内容的同名文件
  2. 环境: Ubuntu 16.04,C++11,gcc version 5.4.0
  3. 非常简陋的一个实现,客户端每次启用只能向服务器请求下载一个文件,要下载多次需要多次启动服务器端


服务器端代码

#include <iostream>
#include <string>

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

const int bufSize = 1024;

void error_handling(const std::string &message);

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    char buffer[bufSize];
    int str_len, i;

    struct sockaddr_in serv_addr, clnt_addr;
    socklen_t clnt_addr_sz;

    if(argc != 2) {
        std::cout << "Usage : " << argv[0] << " <port>" << std::endl;
        exit(1);
    }

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if(serv_sock == -1)
        error_handling("socket() error");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(atoi(argv[1]));

    if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
        error_handling("bind() error");

    if(listen(serv_sock, 1) == -1)
        error_handling("listen() error");

    clnt_add
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值