1,317
社区成员




TMemoryStream* pms = new TMemoryStream();
void *p;
pms->LoadFromFile(FileName);
p=malloc(pms->Size);
pms->Position=0;
pms->ReadBuffer(p,pms->Size);
Socket->SendBuf(p,pms->Size);
free(p);
delete pms;
AnsiString Flag,FileName,rectxt;
int nSize = 0;
__int64 i64Len;
i64Len=Socket->ReceiveLength();
if(i64Len <1)return;
// Memo1->Lines->Add(i64Len);
rectxt = Socket->ReceiveText() ;
if(rectxt.Pos("sendfile"))
{
int pos1,pos2;
pos1 = rectxt.Pos(" <");
pos2 = rectxt.Pos(">");
Flag = rectxt.SubString(1,pos1-1);
FileName = rectxt.SubString(pos1+1,pos2-pos1-1);
memLen=StrToInt(rectxt.SubString(pos2+1,rectxt.Length()-pos2));
Memo1->Lines->Add(Flag);
Memo1->Lines->Add(FileName);
Memo1->Lines->Add(memLen);
if(Flag == "sendfile")
Socket->SendText("FileOk");
}
else
{
nSize =1;
do{
nSize = Socket->ReceiveBuf(buf, sizeof(buf));
ReceiveLen = ReceiveLen + nSize ;
Memo1->Lines->Add(IntToStr(nSize) + " + " + IntToStr(ReceiveLen) + " " + IntToStr(memLen));
if (nSize>0 )
FileWrite1->Write(buf,nSize);
} while(nSize>0 );
}
一个简单的传输的例子 单线程 阻塞模式. 用 bcc32.exe 可直接编译通过.
以下是发送端代码
send.cpp
view plaincopy to clipboardprint?
//---------------------------------------------------------------------------
#include <iostream>
#include "winsock2.h"
using namespace std;
#pragma comment(lib , "ws2_32.lib")
//---------------------------------------------------------------------------
WSADATA wsaData;
UINT uTimerID;
DWORD MAX_SIZE = 1024 * 4;
DWORD FinishSize = 0;
DWORD SendSize = MAX_SIZE;
LPSTR SFileName;
DWORD FSize;
DWORD DWSpeed=0;
DWORD OldFinish=0;
MMRESULT (WINAPI *ptimeSetEvent)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent);
MMRESULT (WINAPI *ptimeKillEvent)(UINT uTimerID);
HINSTANCE DLLInst;
bool init()
{
DLLInst=LoadLibrary("winmm.dll");
if(DLLInst)
{
ptimeSetEvent = (MMRESULT (WINAPI *)(UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD dwUser, UINT fuEvent))GetProcAddress(DLLInst, "timeSetEvent");
if(!ptimeSetEvent) return false;
ptimeKillEvent = (MMRESULT (WINAPI *)(UINT uTimerID))GetProcAddress(DLLInst, "timeKillEvent");
if(!ptimeKillEvent) return false;
return true;
}
return false;
}
void Byte2Human(const DWORD & byte)
{
if(byte < 1024){
cout << ((float)((int)(byte*100+0.5))/100.0) << "B";
return;
}
float kb = byte/1024;
if (kb<1024){
cout << ((float)((int)(kb*100+0.5))/100.0) << "KB";
return ;
}
float mb = kb/1024;
if (mb<1024){
cout << ((float)((int)(mb*100+0.5))/100.0) << "MB";
return;
}
float gb = mb/1024;
cout << ((float)((int)(gb*100+0.5))/100.0) << "GB";
}
void WINAPI TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
DWSpeed = FinishSize-OldFinish;
OldFinish = FinishSize;
cout << '\r';
cout << " ";
cout << '\r';
cout << "文件名:" << SFileName << " " << FinishSize << "/" << FSize << " ";
Byte2Human(DWSpeed);
cout << "/S";
}
int main(int argc, char* argv[])
{
if(!init())
{
cout<<"初始化失败"<<endl;
return 0;
}
int ret;
if(argc < 4)
{
cout << "App.exe Host Port FileName" << endl;
return 0;
}
if((ret=WSAStartup(0x0202, &wsaData))!=0)
{
cout << "WSAStartup Failed!! Code:" << ret << endl;
return 0;
}
SOCKET sock;
struct sockaddr_in server;
sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock==INVALID_SOCKET)
{
cout << "创建socket出错" << endl;
return 0;
}
server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[2]));
server.sin_addr.s_addr=inet_addr(argv[1]);
cout << "正在连接 " << argv[1] << ":" << argv[2] << endl;
if(connect(sock, (struct sockaddr *)&server, sizeof(server))==SOCKET_ERROR)
{
cout << "连接失败" << endl;
return 0;
}
cout << "连接成功" << endl;
//打开文件准备发送
HANDLE hFile;
OFSTRUCT ofs;
HANDLE hMap;
void *pVoid;
SFileName = argv[3];
hFile=(HANDLE)OpenFile(argv[3], &ofs, OF_READWRITE | OF_SHARE_DENY_NONE);
if((HFILE)hFile==HFILE_ERROR)
{
cout << "打开文件失败 ErrorCode=" << GetLastError() << endl;
return 0;
}
FSize=GetFileSize((HANDLE)hFile, NULL);
hMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if(hMap==NULL)
{
cout << "打开映射失败 ErrorCode=" << GetLastError() << endl;
return 0;
}
pVoid=MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(pVoid==NULL)
{
cout << "映射数据失败 ErrorCode=" << GetLastError() << endl;
return 0;
}
char *p = (char *)pVoid;
cout << "正在发送文件 " << argv[3] << endl;
uTimerID=ptimeSetEvent(1000, 0, (LPTIMECALLBACK)TimeProc, NULL, TIME_PERIODIC|TIME_CALLBACK_FUNCTION);
while(1)
{
if(FSize - FinishSize < MAX_SIZE)
{
SendSize = FSize - FinishSize;
}
int ret = send(sock, p+FinishSize, SendSize, 0);
if(ret == SOCKET_ERROR )
{
cout << endl << "Ret=" << ret << " ErrorCode=" << WSAGetLastError() << endl;
return 0;
}
FinishSize += ret;
if(FinishSize == FSize) break;
}
closesocket(sock);
ptimeKillEvent(uTimerID);
CloseHandle(hMap);
CloseHandle(hFile);
cout << endl;
cout << "完成 发送数据量:" << FinishSize << endl;
return 0;
}
//---------------------------------------------------------------------------