用TCP寫了一個下載功能,出現了文本檔案下載了0kb,大點的exe檔案丟掉了一部分導致無法運行。。。
服務端
DWORD WINAPI CreateClientThread(LPVOID lpParameter)//在這個函式完成收到一個檔案路徑并發送檔案
{
SOCKET socketServer = (SOCKET)lpParameter;
char buf_msg[BUFSIZ];
int ret = 0;
int sresult = 0;
FileHelper fh;
do
{
memset(buf_msg, 0, BUFSIZ);
ret = recv(socketServer, buf_msg, BUFSIZ, 0);//收到檔案名
if (ret > 0)
{
if (strcmp(buf_msg, "exit") == 0)
{
cout << "用戶請求關閉連接" << endl;
break;
}
cout << buf_msg << endl;
char recName[BUFSIZ];
strcpy(recName, buf_msg);
FILE *f = fh.selectfile(recName);//此時path_buffer得到了完整路徑E:\1.pdf,并且f指到了這個檔案
char *name = fh.getFileName();//name得到的是檔案及后綴名1.pdf
char sendName[BUFSIZ];
strcpy(sendName, name);
send(socketServer, sendName, BUFSIZ, 0);//發送的是1.pdf
f = fopen(recName, "rb"); //以二進制方式打開檔案
if (f == NULL)
{
cout << "不能打開檔案" << endl;
fclose(f);
system("pause");
exit(0);
}
else
{
//開始傳輸檔案
//回圈發送資料,直到檔案結尾
int nCount;
//long long sum = 0;
while ((nCount = fread(sendName, 1, BUFSIZ, f)) > 0)
{
//cout<<(sum+=nCount)<<endl;//輸出的是當前發送的位元組數
send(socketServer, sendName, nCount, 0);
}
}
}
else if (ret == 0)
{
cout << "連接已關閉..." << endl;
}
else
{
cerr << "收到客戶端資訊失敗" << ::GetLastError() << "\n";
closesocket(socketServer);
system("pause");
return 1;
}
} while (ret > 0);
ret = shutdown(socketServer, SD_SEND);
if (ret == SOCKET_ERROR)
{
cerr << "無法關閉套接字 " << ::GetLastError() << "\n";
closesocket(socketServer);
system("pause");
return 1;
}
//delete &fh;//回收記憶體
//fh = NULL;
return 0;
}
客戶端
void Client::ConnectToServer()
{
//開始連接
FileHelper fh;
int fail = connect(socketClient, (SOCKADDR*)&addrClient, len);
if (fail)
{
cout << "與服務端連接失敗!程式將退出..." << endl;
system("pause");
exit(1);
}
cout << "請輸入你想要傳輸的檔案名:";
cin >> Filename;
//發送地址給服務端
send(socketClient, Filename, BUFSIZ, 0);
//接受服務端的檔案名:1.txt
char revName[BUFSIZ];
recv(socketClient, revName, BUFSIZ, 0);
char fromname[BUFSIZ] = {};
strcpy(fromname, revName);//fromname :1.txt
char* dirName = GetDirName(); //要開始選擇一個地方建一個檔案夾,然后開始傳輸內容
fh.createDir(dirName);
//cout<<"檔案夾創建成功!";
//在dirName目錄下創建一個和服務器里面一模一樣的檔案
char mid[3] = "\\";
char finame[MAX_PATH] = {};
strcat(finame, dirName);
strcat(finame, mid);
strcat(finame, fromname);
FILE *f = fh.createFile(finame);
//開始傳輸檔案
char buffer[BUFSIZ] = "";//檔案緩沖區
int nCount;
while ((nCount = recv(socketClient, buffer, BUFSIZ, 0)) > 0)
{
fwrite(buffer, nCount, 1, f);
}
//Thread.Sleep(10);
//cout<<fromname<<""<<endl;
fclose(f);
}
意外輸出截圖

uj5u.com熱心網友回復:
頂一下,希望有大佬能解決uj5u.com熱心網友回復:
懷疑是fwrite函式的問題,一般嚴謹的做法是判斷fwrite的回傳值,部分成功的話要把沒有寫成功的重新fwrite一下uj5u.com熱心網友回復:
問題不少,recName變數沒有初始化,send沒有判斷回傳值uj5u.com熱心網友回復:
檔案格式,一個是二進制打開的,寫是什么格式呢,看不到轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/61071.html
標籤:網絡通信
上一篇:服務器雙網卡,配置不同ip,可以相互訪問ping通嗎
下一篇:用c寫一個關于網路通信的程式
