哪位兄弟知道通过socket实现文件上传下载的方法,最好有源码,工作急用 哪位兄弟知道通过socket实现文件上传下载的方法,最好有源码,工作急用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 client:send("GET filename") server:send("OK")server:send("s") s表示文件的分段,将大文件分成小部分发送。server:send("END") http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=901 一个TCP和UDP聊天、传收文件程序 详细信息 < Internet与WEB服务 > 例子介绍了如何在局域网中进行聊天、互发文件以及抓取对方屏幕保存为文件。程序还包括了取得本机和对方的IP、计算机名称。滚动ListBox控件等功能。 http://www.vckbase.com/code/relateddoc.asp?id=1893 使用CSockets进行文件传送的代码 详细信息 < WinSock > 本代码提供一对实现在两台计算机间传送文件的函数,本代码提供的方法并不十分适合于传送大型文件. http://www.vckbase.com/code/relateddoc.asp?id=1511 通过网络传送文件程序源代码 详细信息 < Internet与WEB服务 > 利用CSocket类实现网络文件传送,包括发送文件的服务器端、接收文件的客户端程序代码。 大小:127K http://www.vckbase.com/code/downcode.asp?id=430 #include "afxmt.h"CString m_PATH;UINT CNetSendDlg::ThreadA(LPVOID pParam){ CString szIP; struct sockaddr_in sin; WSADATA wsaData; SOCKET sockSrvr,sockRecv; char *IpAddr; if(WSAStartup(0x0101, &wsaData )) { AfxMessageBox("初始化 TCP/IP 协议栈发生错误!"); return 0; } if(wsaData.wVersion != 0x0101) { AfxMessageBox("Winsock version is incorrect!"); WSACleanup(); return 0; } if ((sockSrvr = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) { AfxMessageBox("Create socket error!"); return 0; } if ((sockRecv = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) { AfxMessageBox("Create socket error!"); return 0; } ////////////////////////////////////// CString m_addr; CString m_strT; CString sNetBiosName; char hostname[128]; struct hostent *phost; gethostname(hostname,128); m_addr = hostname; phost = gethostbyname(hostname); int m_iCounter=0; for(int j = 0;j<4;j++) { m_strT.Format("%u", (unsigned int)((unsigned char*)phost->h_addr_list[0])[j]); sNetBiosName+=m_strT; if(m_iCounter<3) { m_iCounter++; sNetBiosName+="."; } } ////////////////////////////////////// szIP=sNetBiosName; IpAddr=szIP.GetBuffer(szIP.GetLength()); sin.sin_family=AF_INET; sin.sin_addr.s_addr=inet_addr(IpAddr); sin.sin_port=htons(800); if(bind(sockSrvr,(sockaddr*)&sin,sizeof(sin))<0) { AfxMessageBox("绑定错误"); return 0; } listen(sockSrvr,5); int length=sizeof(sin); sockRecv=accept(sockSrvr,(struct sockaddr*)&sin,&length); int timeout=300; int status=setsockopt(sockRecv,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(status) { AfxMessageBox("设置超时错误"); WSACleanup(); return 0; } int buf=10240; int status2=setsockopt(sockRecv,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int)); if(status2) { AfxMessageBox("设置缓冲区大小错误"); WSACleanup(); return 0; } ////////////////////////////////////////////////////////////////// WIN32_FIND_DATA fd; FindClose(FindFirstFile(m_PATH,&fd)); send(sockRecv,(char*)&fd,sizeof(WIN32_FIND_DATA),0); //////////////////////////////////////////////////// CFile myFile; if(!myFile.Open(m_PATH, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone)) { return 0; } UINT dwRead=0; byte* data; while(dwRead<fd.nFileSizeLow) { data = new byte[2048]; UINT dw=myFile.Read(data, 2048); send(sockRecv,(char*)data,2048,0); dwRead+=dw; delete [] data; } myFile.Close(); closesocket(sockRecv); closesocket(sockSrvr); WSACleanup(); return 0;}static char BASED_CODE szFilter[]="|*.*|";void CNetSendDlg::OnButton1() {OPENFILENAME ofn ; TCHAR szFullName[_MAX_PATH]; ::ZeroMemory (&ofn, sizeof(OPENFILENAME)) ; szFullName[0] = TEXT('\0') ; ofn.lStructSize = sizeof (OPENFILENAME) ; ofn.hwndOwner = m_hWnd; ofn.hInstance = NULL ; ofn.lpstrFilter = "*.*\0\0" ; ofn.lpstrCustomFilter = NULL ; ofn.nMaxCustFilter = 0 ; ofn.nFilterIndex = 0 ; ofn.nMaxFile = MAX_PATH ; ofn.nMaxFileTitle = MAX_PATH ; ofn.lpstrInitialDir = "c:\\" ; ofn.lpstrTitle = "保存到"; ofn.lpstrFile = szFullName ; ofn.nFileExtension = 0 ; ofn.lpstrDefExt = TEXT("*") ; ofn.lCustData = 0 ; ofn.lpfnHook = NULL ; ofn.lpTemplateName = NULL ; ofn.Flags = OFN_ENABLESIZING | OFN_OVERWRITEPROMPT ; if(!::GetOpenFileName(&ofn)) return; GetDlgItem(IDC_EDIT1)->SetWindowText(ofn.lpstrFile); }void CNetSendDlg::OnButton2() { GetDlgItem(IDC_EDIT1)->GetWindowText(m_PATH); AfxBeginThread(ThreadA,this,THREAD_PRIORITY_IDLE);}void CNetSendDlg::OnRec() { CString szIP; GetDlgItem(IDC_EDIT2)->GetWindowText(szIP); struct sockaddr_in sin; WSADATA wsaData; SOCKET sockClient; int IpPort; char *IpAddr; IpAddr=szIP.GetBuffer(szIP.GetLength()); IpPort=800; if(WSAStartup(0x0101, &wsaData )) { AfxMessageBox("初始化 TCP/IP 协议栈发生错误!"); return; } if(wsaData.wVersion != 0x0101) { AfxMessageBox("Winsock版本不正确!"); WSACleanup(); return; } if ((sockClient = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) { AfxMessageBox("创建socket错误!"); return; } sin.sin_family=AF_INET; sin.sin_addr.s_addr=inet_addr(IpAddr); sin.sin_port=htons((short)IpPort); int timeout=300; int status=setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(status) { MessageBox("设置超时错误"); WSACleanup(); return ; } int buf=10240; int status2=setsockopt(sockClient,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int)); if(status2) { MessageBox("设置缓冲区大小错误"); WSACleanup(); return ; } if(connect (sockClient, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR) { MessageBox("连接错误"); closesocket(sockClient); WSACleanup(); return; } WIN32_FIND_DATA fd; recv(sockClient,(char*)&fd,sizeof(WIN32_FIND_DATA),0); m_Progress2.SetRange(0,fd.nFileSizeLow/2048); m_Progress2.SetStep(1); CString m_ProDir="e:\\"; CFile destFile(m_ProDir+fd.cFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); UINT dwRead = 0; while(dwRead<fd.nFileSizeLow) { byte* data = new byte[2048]; memset(data,0,2048); UINT dw=recv(sockClient,(char*)data,2048,0); destFile.Write(data, dw); dwRead+=dw; delete [] data; m_Progress2.StepIt(); } m_Progress2.SetPos(fd.nFileSizeLow); m_Progress2.SetPos(0); SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime, &fd.ftLastAccessTime,&fd.ftLastWriteTime); SetFileAttributes(m_ProDir+fd.cFileName,fd.dwFileAttributes); destFile.Close(); closesocket (sockClient); WSACleanup(); } me,测试过的,不过是点对点的,并且采用流传输,多大的文件都可以,不过要看你的带宽了!EMAIL:[email protected] 等待对话框,模态对话框无法结束 求一段DirectSound捕获声音的代码,万分感谢 Taskbar Drag and Drop 关于VC文档的名称 【请教】CFormView中ListBox控件大小如何改变?? 谁能给我一个样条拟合或B样条拟合的算例? 高分求教:如何将用ADO从数据库中取出的VARIANT型数据转化为CString型数据? 智勇三国架构设计总结书,欢迎指教 如何讓鼠標指針跟隨光標移動呢? 怎样在对话框上画分隔线(就象菜单上的分隔线)? 怎样往excel文件里面写宏 前后增量与左值问题?????????
server:send("OK")
server:send("s") s表示文件的分段,将大文件分成小部分发送。
server:send("END")
http://www.vckbase.com/code/relateddoc.asp?id=1511
大小:127K http://www.vckbase.com/code/downcode.asp?id=430
CString m_PATH;
UINT CNetSendDlg::ThreadA(LPVOID pParam)
{
CString szIP;
struct sockaddr_in sin;
WSADATA wsaData;
SOCKET sockSrvr,sockRecv;
char *IpAddr;
if(WSAStartup(0x0101, &wsaData ))
{
AfxMessageBox("初始化 TCP/IP 协议栈发生错误!");
return 0;
}
if(wsaData.wVersion != 0x0101)
{
AfxMessageBox("Winsock version is incorrect!");
WSACleanup();
return 0;
}
if ((sockSrvr = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
AfxMessageBox("Create socket error!");
return 0;
} if ((sockRecv = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
AfxMessageBox("Create socket error!");
return 0;
}
//////////////////////////////////////
CString m_addr;
CString m_strT;
CString sNetBiosName;
char hostname[128];
struct hostent *phost;
gethostname(hostname,128);
m_addr = hostname;
phost = gethostbyname(hostname);
int m_iCounter=0;
for(int j = 0;j<4;j++)
{
m_strT.Format("%u", (unsigned int)((unsigned char*)phost->h_addr_list[0])[j]);
sNetBiosName+=m_strT;
if(m_iCounter<3)
{
m_iCounter++;
sNetBiosName+=".";
}
}
//////////////////////////////////////
szIP=sNetBiosName;
IpAddr=szIP.GetBuffer(szIP.GetLength());
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(IpAddr);
sin.sin_port=htons(800);
if(bind(sockSrvr,(sockaddr*)&sin,sizeof(sin))<0)
{
AfxMessageBox("绑定错误");
return 0;
}
listen(sockSrvr,5);
int length=sizeof(sin);
sockRecv=accept(sockSrvr,(struct sockaddr*)&sin,&length);
int timeout=300;
int status=setsockopt(sockRecv,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(status)
{
AfxMessageBox("设置超时错误");
WSACleanup();
return 0;
}
int buf=10240;
int status2=setsockopt(sockRecv,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int));
if(status2)
{
AfxMessageBox("设置缓冲区大小错误");
WSACleanup();
return 0;
}
//////////////////////////////////////////////////////////////////
WIN32_FIND_DATA fd;
FindClose(FindFirstFile(m_PATH,&fd));
send(sockRecv,(char*)&fd,sizeof(WIN32_FIND_DATA),0); ////////////////////////////////////////////////////
CFile myFile;
if(!myFile.Open(m_PATH, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone))
{
return 0;
} UINT dwRead=0;
byte* data;
while(dwRead<fd.nFileSizeLow)
{
data = new byte[2048];
UINT dw=myFile.Read(data, 2048);
send(sockRecv,(char*)data,2048,0);
dwRead+=dw;
delete [] data; } myFile.Close();
closesocket(sockRecv);
closesocket(sockSrvr);
WSACleanup(); return 0;
}
static char BASED_CODE szFilter[]="|*.*|";
void CNetSendDlg::OnButton1()
{
OPENFILENAME ofn ;
TCHAR szFullName[_MAX_PATH];
::ZeroMemory (&ofn, sizeof(OPENFILENAME)) ;
szFullName[0] = TEXT('\0') ;
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = m_hWnd;
ofn.hInstance = NULL ;
ofn.lpstrFilter = "*.*\0\0" ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.nMaxFile = MAX_PATH ;
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = "c:\\" ;
ofn.lpstrTitle = "保存到";
ofn.lpstrFile = szFullName ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT("*") ;
ofn.lCustData = 0 ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
ofn.Flags = OFN_ENABLESIZING | OFN_OVERWRITEPROMPT ;
if(!::GetOpenFileName(&ofn))
return;
GetDlgItem(IDC_EDIT1)->SetWindowText(ofn.lpstrFile);
}void CNetSendDlg::OnButton2()
{
GetDlgItem(IDC_EDIT1)->GetWindowText(m_PATH);
AfxBeginThread(ThreadA,this,THREAD_PRIORITY_IDLE);
}void CNetSendDlg::OnRec()
{
CString szIP;
GetDlgItem(IDC_EDIT2)->GetWindowText(szIP);
struct sockaddr_in sin;
WSADATA wsaData;
SOCKET sockClient;
int IpPort;
char *IpAddr;
IpAddr=szIP.GetBuffer(szIP.GetLength());
IpPort=800;
if(WSAStartup(0x0101, &wsaData ))
{
AfxMessageBox("初始化 TCP/IP 协议栈发生错误!");
return;
}
if(wsaData.wVersion != 0x0101)
{
AfxMessageBox("Winsock版本不正确!");
WSACleanup();
return;
}
if ((sockClient = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
AfxMessageBox("创建socket错误!");
return;
}
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(IpAddr);
sin.sin_port=htons((short)IpPort);
int timeout=300;
int status=setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(status)
{
MessageBox("设置超时错误");
WSACleanup();
return ;
}
int buf=10240;
int status2=setsockopt(sockClient,SOL_SOCKET,SO_RCVBUF,(char*)&buf,sizeof(int));
if(status2)
{
MessageBox("设置缓冲区大小错误");
WSACleanup();
return ;
}
if(connect (sockClient, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR)
{
MessageBox("连接错误");
closesocket(sockClient);
WSACleanup();
return;
} WIN32_FIND_DATA fd;
recv(sockClient,(char*)&fd,sizeof(WIN32_FIND_DATA),0); m_Progress2.SetRange(0,fd.nFileSizeLow/2048);
m_Progress2.SetStep(1); CString m_ProDir="e:\\";
CFile destFile(m_ProDir+fd.cFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
UINT dwRead = 0;
while(dwRead<fd.nFileSizeLow)
{
byte* data = new byte[2048];
memset(data,0,2048);
UINT dw=recv(sockClient,(char*)data,2048,0);
destFile.Write(data, dw);
dwRead+=dw;
delete [] data;
m_Progress2.StepIt();
}
m_Progress2.SetPos(fd.nFileSizeLow);
m_Progress2.SetPos(0);
SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime,
&fd.ftLastAccessTime,&fd.ftLastWriteTime);
SetFileAttributes(m_ProDir+fd.cFileName,fd.dwFileAttributes);
destFile.Close();
closesocket (sockClient);
WSACleanup();
}
EMAIL:[email protected]