基于半关闭的文件传输程序
这里给出了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; }
运行截图: