2.2.系统及网络编程——网络基础巩固及Socket网络编程(二)

2.2.系统及网络编程——网络基础巩固及Socket网络编程(二)

咕了好几天了,应该要补一补了,这篇是对于socket编程的另一个实例,主要加入了文件信息的传递

文件的读写操作

文件流

打开:FILE *fopen(const char *pathname, const char *mode);
读:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
写:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
关闭:int fclose(FILE *stream);

文件描述符符

打开:int open(const char *pathname, int flags);
读:ssize_t read(int fd, void *buf, size_t count);
写:ssize_t wirte(int fd, const void *buf, size_t count);
关闭:int close(int fd);

代码范例

服务端

head.h中包含常用的C语言库以及自己写的一点函数,具体可见上期

#include "head.h"
int main(int argc, char **argv){
    if(argc != 2){
        fprintf(stderr, "Usage:%s port!\n", argv[0]);
        exit(1);
    }
    int server_listen, sockfd, port;
    port = atoi(argv[1]);
    if((server_listen = socket_create(port)) < 0){
        perror("socket_create()");
        exit(1);
    }
    if((sockfd = accept(server_listen, NULL, NULL)) < 0){
        perror("accept()");
        exit(1);
    }
    FILE *fp;
    if((fp = fopen("./tmp.txt", "w")) == NULL){
        perror("fopen()");
        exit(1);
    }
    long long i = 0;
    long long len;
    recv(sockfd, &len, sizeof(len), 0)
    char buff[1024 + 5] = {0};
    while(1){
        memset(buff, 0, sizeof(buff));
        int retval = recv(sockfd, buff, sizeof(buff), 0);
        if (retval <= 0){
            printf("Error!\n");
            close(sockfd);
            break;
        }
        int nwrite = fwrite(buff, 1, 1024, fp);
        int i += strlen(buff);
        if(i == len){
            printf("Over\n");
            close(sockfd);
            break;
        }
    }
    fclose(fp);
    return 0;
}
客户端

客户端建立套接字并连接到服务端函数

int socket_connect(char *ip, int port){
    int sockfd;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        return -1;
    }
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(ip);
    if(connect(sockfd, (struct sockaddr*)&server, sizeof(server)) < 0){
        return -1;
    }
    return sockfd;
}

客户端代码

#include "head.h"

int main(int argc, char **argv){
    if (argc != 4){
        fprintf(stderr, "Usage : %s ip port file!\n", argv[0]);
        exit(1);
    }
    int port, sockfd;
    char ip[20] = {0};
    char file[50] = {0};
    FILE *fp;
    strcpy(ip, argv[1]);
    port = atoi(argv[2]);
    strcpy(file, argv[3]);
    if ((sockfd = socket_connect(ip, port)) < 0){
        perror("socket_connect()");
        exit(1);
    }
    if ((fp = fopen(file, "r")) == NULL){
        perror("fopen()");
        exit(1);
    }
    size_t size;
    char buff[1024] = {0};
    while((size = fread(buff, 1, 1024, fp))){
        send(sockfd, buff, size, 0);
        printf("%s\n", buff);
        bzero(buff, sizeof(buff));
    }
    close(sockfd);
    fclose(fp);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值