这里给出了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;
}
运行截图: