㈠ VC怎麼進行文件傳輸
vc對文來件進行網路傳輸要用到源套接字,傳輸效率不低,像ie那樣滿足用戶需要也沒有問題,但是實現越來很復雜,想傳輸文件夾思路只能是把文件夾裡面的文件一個一個的傳輸,同時把文件夾名以及文件名也傳輸過去,實現上傳和下載系統也有專門的函數,不用你自己去寫了,但是你想實現的高級一點就自己寫吧。
㈡ 關於VC++ SOCKET文件傳輸問題
你先來用readfile把文件一次性讀到緩沖區中。自這樣下面的操作就和傳送字元一樣了。在將文件的長度通知客戶端,讓他分配好內存,准備接受文件。下面就將緩沖區的東西發送到客戶端就行了。這個方法進行小文件傳輸還湊合,要傳輸大文件需要先把文件分塊傳送。
char *pBuffer = new char[1024];
DWORD dwReadSize = 0;
::ReadFile(hFile,pBuffer,1024,&dwReadSize,NULL);
send(socket,reinterpret_cast<char *>(pBuffer),dwReadSize,NULL);
當然,文件大小需要你用GetFileSize來獲得
最後記得closehandle
㈢ VC SOCKET 文件傳輸程序問題
用VC6.0建立兩個WIndows32 Console Application程序,並且選擇一個支持MFC的程序,第一個程序中輸入:
// server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "server.h"
#include<afxsock.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
typedef struct _SOCKET_STREAM_FILE_INFO {
TCHAR szFileTitle[128]; //文件的標題名
DWORD dwFileAttributes; //文件的屬性
FILETIME ftCreationTime; //文件的創建時間
FILETIME ftLastAccessTime; //文件的最後訪問時間
FILETIME ftLastWriteTime; //文件的最後修改時間
DWORD nFileSizeHigh; //文件大小的高位雙字
DWORD nFileSizeLow; //文件大小的低位雙字
DWORD dwReserved0; //保留,為0
DWORD dwReserved1; //保留,為0
} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetMoleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}
CSocket sockClient;
sockClient.Create();
if(!sockClient.Connect("127.0.0.1", 800))
{
AfxMessageBox("連接到對方機器失敗!");
return 0;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
UINT dwRead = 0;
while(dwRead)
{
byte* data = new byte[1024];
memset(data,0,1024);
UINT dw=sockClient.Receive(data, 1024);
destFile.Write(data, dw);
dwRead+=dw;
}
SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
destFile.Close();
SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
sockClient.Close();
AfxMessageBox("接收完畢!");
return nRetCode;
}
另外一個程序輸入:
// client.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "client.h"
#include <afxsock.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
typedef struct _SOCKET_STREAM_FILE_INFO {
TCHAR szFileTitle[128]; //文件的標題名
DWORD dwFileAttributes; //文件的屬性
FILETIME ftCreationTime; //文件的創建時間
FILETIME ftLastAccessTime; //文件的最後訪問時間
FILETIME ftLastWriteTime; //文件的最後修改時間
DWORD nFileSizeHigh; //文件大小的高位雙字
DWORD nFileSizeLow; //文件大小的低位雙字
DWORD dwReserved0; //保留,為0
DWORD dwReserved1; //保留,為0
} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetMoleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}
CFile myFile;
CString filename="123.txt";
if(!myFile.Open(filename, CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
return 0;
}
CSocket sockSrvr;
sockSrvr.Create(800);
sockSrvr.Listen();
CSocket sockRecv;
sockSrvr.Accept(sockRecv);
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA FindFileData;
FindClose(FindFirstFile(filename,&FindFileData));
memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());
StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;
StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow;
sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
UINT dwRead=0;
while(dwRead)
{
byte* data = new byte[1024];
UINT dw=myFile.Read(data, 1024);
sockRecv.Send(data, dw);
dwRead+=dw;
}
myFile.Close();
sockRecv.Close();
AfxMessageBox("發送完畢!");
return nRetCode;
}
現在應該可以運行了,然後根據你的需要修改
㈣ vc++網路編程中如何應用socket實現跨網段文件傳輸
不同網段間傳送數據不是應用層需要考慮的問題。應當交給網路層解決。也就是看看你的路由設置是否正確。如果你從A機器 PING B機器不通的話,你的程序也是沒辦法傳送數據的。
㈤ vc++區域網信息,文件傳輸
就是通過socket,CFileDialog來傳就行了。