基于半关闭的文件传输程序

 

这里给出了windows版本的代码,首先要导入ws2_32.lib,我的路径在C:\Windows\System32,在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;
}

 

运行截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值