利用tcp协议实现本机上的文件传输,使用c++中fstream对文件进行操作
实现时出现的问题
收获
服务器
#include<iostream>
#include<WinSock2.h>
#include<Windows.h>
#include<fstream>
#pragma comment(lib,"Ws2_32")
using namespace std;
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested,
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
WSACleanup();
return 1;
}
sockaddr_in sockline;
sockline.sin_family = AF_INET;
sockline.sin_port = htons(1234);
sockline.sin_addr.S_un.S_addr = 0;
if (SOCKET_ERROR == bind(sock, (const sockaddr*)&sockline, sizeof(sockline)))
{
closesocket(sock);
WSACleanup();
return 1;
}
if (listen(sock, 10))
{
closesocket(sock);
WSACleanup();
return 1;
}
sockaddr sockll;
int nsize = sizeof(sockll);
while (1)
{
SOCKET sockwinter = accept(sock, &sockll,
CreateThread(0, 0, &ThreadProc, (void*)sockwinter, 0, 0);
}
closesocket(sock);
WSACleanup();
return 0;
}
DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter)
{
SOCKET sockwinter = (SOCKET)lpParameter;
while (1)
{
char wenjianmingjie[1024] = {0};
int wenjiandaxiao = 0;
char wenjianming[64] = {0};
int nrecv1 = recv(sockwinter, wenjianmingjie, sizeof(wenjianmingjie), 0);
if (nrecv1 >= 0)
{
char* c = wenjianmingjie;
int i = 0;
while (*c != ' ' '\0')
{
wenjianming[i++] = *c;
c++;
}
cout << wenjianming << endl;
c++;
while (*c != '\0')
{
wenjiandaxiao = wenjiandaxiao * 10 + ( * c - '0');
c++;
}
}
cout << "是否接受" << endl;
cout << "yes or no" << endl;
char querenxinxi[100];
cin >> querenxinxi;
send(sockwinter, querenxinxi, sizeof(querenxinxi), 0);
if (strcmp(querenxinxi,"yes") == 0)
{
char baocunweizhi[1024];
cout << "请输入保存位置" << endl;
cin >> baocunweizhi;
ofstream os;
os.open(baocunweizhi);
while (wenjiandaxiao > 0)
{
char wenjianhuan[1024] = {0};
int nrecv2 = recv(sockwinter, wenjianhuan, sizeof(wenjianhuan),0);
if (nrecv2 >= 0)
{
wenjiandaxiao -= (int)strlen(wenjianhuan);
os << wenjianhuan;
}
}
os.close();
}
}
}
客户端
#include<iostream>
#include<WinSock2.h>
#include<Windows.h>
#include<fstream>
#include<WS2tcpip.h>
#pragma comment(lib,"Ws2_32")
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested,
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in sockline;
sockline.sin_family = AF_INET;
sockline.sin_port = htons(1234);
InetPtonW(AF_INET, L"127.0.0.1", &sockline.sin_addr);
if (SOCKET_ERROR == connect(sock, (const sockaddr*)&sockline, sizeof(sockline)))
{
closesocket(sock);
WSACleanup();
return 1;
}
ifstream is;
char wenjiandizhi[1024];
cout << "请输入文件地址" << endl;
cin >> wenjiandizhi;
char wenjianming[62] = {0};
char* c = wenjiandizhi;
while (*c != '\0')
{
c++;
}
while (*c != '\\')
{
c--;
}
c++;
strcpy_s(wenjianming, c);
unsigned int wenjiandaxiao = 0;
char wenjian[1024];
is.open(wenjiandizhi);
while (is >> wenjian)
{
wenjiandaxiao += strlen(wenjian);
}
is.close();
char s[1024];
sprintf_s(s, "%d", wenjiandaxiao);
strcat_s(wenjianming," ");
strcat_s(wenjianming,s);
send(sock, wenjianming, sizeof(wenjianming), 0);
char querenxinxi[100];
int recvn = recv(sock, querenxinxi, sizeof(querenxinxi), 0);
if (recvn >= 0)
{
if (strcmp(querenxinxi,"yes") == 0)
{
is.open(wenjiandizhi);
while( is >> wenjian)
send(sock, wenjian, sizeof(wenjian), 0);
is.close();
}
}
closesocket(sock);
WSACleanup();
return 0;
}
存在问题