您的位置:首页 > 理论基础 > 计算机网络

linux网络编程——TCP文件服务器

2012-08-19 12:22 281 查看
程序功能:

客户端能够通过命令显示文件服务器上的文件,能够上传、下载文件等等功能;

程序如下:

(1)、server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <dirent.h>
#include <fcntl.h>

struct message
{
    char cmd[10];
    char filename[20];
};

void list_file(int , struct message *);
void get_file(int , struct message *);
void put_file(int , struct message *);

int main(int argc, const char *argv[])
{
    int listen_fd, socket_fd;
    struct sockaddr_in server_addr, client_addr;
    int client_addrlen;
    struct message msg;

    if (argc < 3)
    {
        fprintf(stderr, "usages : %s ip port\n", argv[0]);
        exit(-1);
    }

    if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("failed to create socket");
        exit(-1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(argv[2]));
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);

    client_addrlen = sizeof(struct sockaddr);

    if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("failed to bind");
        exit(-1);
    }

    listen(listen_fd, 5);

    while(1)
    {
        if ((socket_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addrlen)) < 0)
        {
            perror("failed to accept");
            exit(-1);
        }

        memset(&msg, 0, sizeof(msg));
        recv(socket_fd, &msg, sizeof(msg), 0);

        printf("cmd : %s\n", msg.cmd);

        if (strcmp(msg.cmd, "list") == 0)
            list_file(socket_fd, &msg);

        if (strcmp(msg.cmd, "get") == 0)
            get_file(socket_fd, &msg);

        if (strcmp(msg.cmd, "put") == 0)
            put_file(socket_fd, &msg);
    }

    return 0;
}

void list_file(int socket_fd, struct message *msg)
{
    DIR *dir;
    struct dirent *dp;
    char buf[100];

    if ((dir = opendir(".")) < 0)
    {
        perror("failed to open dir");
        exit(-1);
    }

    memset(buf, 0, sizeof(buf));

    while ((dp = readdir(dir)) != NULL)
    {
        if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
            continue;

        strcat(buf, dp->d_name);
        strcat(buf, " ");
    }

    send(socket_fd, buf, strlen(buf) + 1, 0);
    close(socket_fd);
    
    return ;
}

void get_file(int socket_fd, struct message *msg)
{
    int fd;
    char buf[1024];
    int num = 0;

    if ((fd = open(msg->filename, O_RDONLY)) < 0)
    {
        perror("failed to open file");
        exit(-1);
    }

    memset(buf, 0, sizeof(buf));

    while((num = read(fd, buf, sizeof(buf))) > 0)
    {
        usleep(500);
        send(socket_fd, buf, num, 0);
    }

    close(fd);
    close(socket_fd);

    return ;
}

void put_file(int socket_fd, struct message *msg)
{
    int fd;
    char buf[1024];
    int num = 0;

    if ((fd = open(msg->filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0)
    {
        perror("failed to create file");
        exit(-1);
    }

    memset(buf, 0, sizeof(buf));

    while((num = recv(socket_fd, buf, sizeof(buf), 0)) > 0)
        write(fd, buf, num);

    close(fd);
    close(socket_fd);
    return ;
}
(2)client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <dirent.h>
#include <fcntl.h>

struct message
{
    char cmd[10];
    char filename[20];
};

void list_file(struct message , char *, struct sockaddr_in);
void get_file(struct message , char *, char *, struct sockaddr_in);
void put_file(struct message , char *, char *, struct sockaddr_in);

int main(int argc, const char *argv[])
{
    struct sockaddr_in server_addr;
    struct message msg;
    char buf[100];
    char *arg[10];
    int i = 0;

    if (argc < 3)
    {
        fprintf(stderr, "usages: %s ip port\n", argv[0]);
        exit(-1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(argv[2]));
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);

    while (1)
    {
        memset(buf, 0, sizeof(buf));
        memset(&msg, 0, sizeof(msg));
        i = 0;

        printf("##################################\n");
        printf("function:\n");
        printf("Input \"list\" can list the file server's files\n");
        printf("Input \"get filename\" can download file from file server\n");
        printf("Input \"put filename\" can upload file to file server\n");
        printf("Input \"quit\" can quit the client\n");
        printf("##################################\n");
        
        printf(">");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = 0;

        if (strncmp(buf, "quit", 4) == 0)
            break;
       
        arg[i] = strtok(buf, " ");
        while(arg[i] != NULL)
            arg[++i] = strtok(NULL, " ");

        if (strcmp(arg[0], "list") == 0)
            list_file(msg, arg[0], server_addr);
        else if (strcmp(arg[0], "get") == 0)
            get_file(msg, arg[0], arg[1], server_addr);
        else if (strcmp(arg[0], "put") == 0)
            put_file(msg, arg[0], arg[1], server_addr);
    }

    return 0;
}

void list_file(struct message msg, char *cmd, struct sockaddr_in server_addr)
{
    char buf[100];
    int server_fd;

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("failed to create socket");
        exit(-1);
    }

    if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("failed to connect");
        exit(-1);
    }
    
    strcpy(msg.cmd, cmd);
    send(server_fd, &msg, sizeof(msg), 0);

    usleep(500);

    memset(buf, 0, sizeof(buf));
    recv(server_fd, buf, sizeof(buf), 0);
    printf("%s\n", buf);

    close(server_fd);

    return ;
}

void get_file(struct message msg, char *cmd, char *filename, struct sockaddr_in server_addr)
{
    int fd;
    int server_fd;
    char buf[1024];
    int num = 0;

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("failed to create socket");
        exit(-1);
    }
    
    if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("failed to connect");
        exit(-1);
    }

    if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0)
    {
        perror("failed to create file");
        exit(-1);
    }

    strcpy(msg.cmd, cmd);
    strcpy(msg.filename, filename);
    send(server_fd, &msg, sizeof(msg), 0);

    memset(buf, 0, sizeof(buf));
    while ((num = recv(server_fd, buf, sizeof(buf), 0)) > 0)
    {
        usleep(500);
        write(fd, buf, num);
        memset(buf, 0, sizeof(buf));
    }

    printf("DownLoad OK!\n");
    close(fd);
    close(server_fd);

    return ;
}

void put_file(struct message msg, char *cmd, char *filename, struct sockaddr_in server_addr)
{
    int fd;
    int server_fd;
    int num = 0;
    char buf[1024];

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("failed to create socket");
        exit(-1);
    }

    if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("failed to connect");
        exit(-1);
    }
    
    strcpy(msg.cmd, cmd);
    strcpy(msg.filename, filename);
    send(server_fd, &msg, sizeof(msg), 0);

    usleep(500);

    if ((fd = open(filename, O_RDONLY)) < 0)
    {
        perror("failed to open file");
        exit(-1);
    }

    memset(buf, 0, sizeof(buf));
    while ((num = read(fd, buf, sizeof(buf))) > 0)
        send(server_fd, buf, num, 0);

    printf("UpLoad OK!\n");
    close(fd);
    close(server_fd);

    return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: