zoukankan      html  css  js  c++  java
  • 基于半关闭的文件传输程序

    这里给出了windows版本的代码,首先要导入ws2_32.lib,我的路径在C:WindowsSystem32,在codeblocks-setting-compiler-linker settings添加。

    服务端(首先创建好1.txt)

    #include <stdio.h>
    #include <cstdlib>
    #include <cstring>
    #include <unistd.h>
    #include <winsock2.h>
    #include <iostream>
    
    using namespace std;
    const int N = 1024;
    
    int main(int argc, char **argv)
    {
        WSADATA wsadata;
        SOCKET ser_sock, cli_sock;
        if(WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
            puts("ser_0 error");
    
        FILE *fp = fopen("1.txt", "rb");
        if(!fp) puts("file error");
    
        ser_sock = socket(PF_INET, SOCK_STREAM, 0);
        if(ser_sock == INVALID_SOCKET) puts("ser_1 error");
    
        SOCKADDR_IN ser_addr, cli_addr;
        memset(&ser_addr, 0, sizeof(ser_addr));
        ser_addr.sin_family = AF_INET;
        ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        ser_addr.sin_port = htons(atoi(argv[1]));
        if(bind(ser_sock, (SOCKADDR *)&ser_addr, sizeof(ser_addr)) != 0) puts("ser_2 error");
    
        if(listen(ser_sock, 5) != 0) puts("ser_3 error");
    
        int len = sizeof(cli_addr);
        cli_sock = accept(ser_sock, (SOCKADDR *)&cli_addr, &len);
        if(cli_sock == INVALID_SOCKET) puts("ser_4 error");
    
        char s[100];
        len = fread(s, 1, 50, fp);//从文件流中读
        send(cli_sock, s, len, 0);
        shutdown(cli_sock, SD_SEND);
        len = recv(cli_sock, s, 50, 0);
        s[len] = 0;
        puts(s);
    
        closesocket(cli_sock);
        closesocket(ser_sock);
        fclose(fp);
        WSACleanup();
        return 0;
    }

    客户端

    #include <stdio.h>
    #include <cstdlib>  //atoi
    #include <cstring>
    #include <unistd.h> //write,read,close
    #include <winsock2.h>
    #include <iostream>
    
    using namespace std;
    const int N = 1024;
    
    int main(int argc, char **argv)
    {
        WSADATA wsadata;
        SOCKET sock;
        if(WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
            puts("cli_0 error");
    
        FILE *fp = fopen("2.txt", "wb");
        if(!fp) puts("file error");
    
        sock = socket(PF_INET, SOCK_STREAM, 0);
        if(sock == INVALID_SOCKET) puts("cli_1 error");
    
        SOCKADDR_IN ser_addr;
        memset(&ser_addr, 0, sizeof(ser_addr));
        ser_addr.sin_family = AF_INET;
        ser_addr.sin_addr.s_addr = inet_addr(argv[1]);
        ser_addr.sin_port = htons(atoi(argv[2]));
        if(connect(sock, (SOCKADDR *)&ser_addr, sizeof(ser_addr)) != 0) puts("cli_2 error");
    
        char s[100];
        int len = recv(sock, s, 50, 0);
        fwrite(s, 1, len, fp); //写入文件流
        send(sock, "Thank you!", 10, 0);
        cout<<"文件读取成功"<<endl;
    
        closesocket(sock);
        fclose(fp);
        WSACleanup();
        return 0;
    }

    运行截图:

  • 相关阅读:
    Spyder | 关于报错No module named 'PyQt5.QtWebKitWidgets'
    Java基础(11) | 接口
    Java基础(10) | 抽象
    Java基础(9) | 继承
    Java基础(7) | String
    Java基础(6) | ArrayList
    CodeBlocks17.12配置GNU GCC + 汉化
    图片懒加载
    Mac安装Mysql 超详细(转载)
    剑指 Offer 03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/lesroad/p/9530067.html
Copyright © 2011-2022 走看看