如果用结构体发送和接收文件流?(高手来救命呀)

copico 2005-04-12 02:21:53
不想用TStrm和TStrmsev来发送文件,
我想用TCientSocket和TServerSocket来发送sendbuf();来发送一个结构体来发送文件?
文件放在结构里的TFileStream *file 来存储要发送的文件?
请问这个该怎么做?
怎么发送,怎么接收?

由其是怎么接收文件流TFileStream ?
...全文
193 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
copico 2005-04-14
  • 打赏
  • 举报
回复
再解
constantine 2005-04-14
  • 打赏
  • 举报
回复
你跟结构太.....
除了发文件,根本就不需要,那么为什么要做呢?????????????????????????

最起码可以这样改进,不要他,发送文件之前先发一个包,说明是发文件,以及一些必要的参数,比如包多大之类,接下来再发送文件流,接受端如果收到前面那个接受文件的包,马上调用接受函数,按照参数,接受处理下面马上达到的文件流,这样不就可以了吗

其实你的结构很多都要拆,分析哪些是共有的,做为一个基础结构,其他包含他就可以,
这样可以灵活处理
copico 2005-04-12
  • 打赏
  • 举报
回复
是呀,就几个字节
只是证明能发送文件就可以了
那接受TFileStream应该怎么弄呢?

如果发送大点的文件,用NMStrmServ应该可以吧?
happyct 2005-04-12
  • 打赏
  • 举报
回复
你的文件不会都是几百个字节那么小吧?你测试一下,Sendbuf到底一次能收发多少字节的内容?哪有你这样想把一个文件丢Struct就想直接发送的?
happyct 2005-04-12
  • 打赏
  • 举报
回复
不是我的麻烦,而是你的没用。

你这样用Struct来收发,也太那个了。。
liubofan2004 2005-04-12
  • 打赏
  • 举报
回复
免费培训信息

本周六(4月16日)软件工程师班免费听讲(可以免费听三天课程)。系列课程由浅入深针
对无软件开发基础,且有志于从事IT行业的人。感兴趣者,请速致电010-51607418定
座。(详情请登陆http://www.zhihuigu.com 和 http://www.zhihuigu.net)

特邀著名IT专家,Microsft,Sun高级技术培训师吕智良先生现场授课。座位有限,有
兴趣者请在本周四之前电话定位。

第一天课程:Windows Server 2003 的配置与管理
课程安排如下:

第一天部分课程安排如下:

PPT1
内容提要
基本概念介绍(硬件/软件/操作系统)
Microsoft操作系统的发展历程
Windows Server 2003的安装

PPT2
软件、硬件、操作系统概念和分类
微软公司(Microsoft)操作系统的发展
家庭用户
DOS (Disk Operating System) – 磁盘操作系统
Windows 3.x – 视窗操作系统
Windows 95 – 视窗95
Windows 98 – 视窗98
Windows ME (Millennium ) – 视窗千年版
Windows XP Home Edition – XP家庭版
商业用户
Windows NT Server/Windows NT Workstation
Windows 2000 Server/Windows 2000 Professional
Windows Server 2003/Windows XP Professional

PPT3
实战项目: 安装 Windows Server 2003 企业版
形式:两人一组,参考书上(P12-P32)协商讨论完成。
提供的资源:
VMVare 5.0 虚拟机系统
Alcohol 120%虚拟光驱软件
Windows Server 2003 企业版镜像磁盘文件
助教现场指导答疑
时间:2个小时
此实战项目的意义
熟悉Windows Server 2003的完整安装过程
熟悉使用VMVare 5.0虚拟机软件系统
熟悉使用Alcohol 120%虚拟光驱软件
增加实际动手能力和团队协作能力

PPT4
本章总结

本章主要介绍一些基本的概念,了解 Microsoft Windows 一系列操作系统的发展
过程。最后通过实际安装Windows Server 2003,以加深对该操作系统的理解并掌握
VMWare和Alcohol 120%等常用工具软件的使用。
本章书本上内容理论部分太深,涉及面太广,而且和实际工作联系不是很紧密,不建议
学生全文阅读。


智慧谷程序员俱乐部广聚各路好手!
www.zhihuigu.com
zyyoung 2005-04-12
  • 打赏
  • 举报
回复
ding
copico 2005-04-12
  • 打赏
  • 举报
回复
我的结构体是

typedef struct TUser{
int type;//1,发送文本 2,登录信息(用户名,密码) 3,正确登录,4,错误登录 5,单机信息 6,远程注消,7,远程重启,8,远程关机 9,屏幕截图 10,发送接受文件
char UserName[15];
char UserPassword[15];
char ChatContent[200];
TFileStream *Strm;
}UUser;

发送文件端发送文件夹代码是:
if(ValidFile)
{
UUser file;
file.type=10;
file.Strm=new TFileStream(suiEdit2->Text,fmOpenReadWrite);
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
{

ServerSocket1->Socket->Connections[i]->SendBuf(&file,sizeof(file));
}
}
else
{
suiMessageDialog1->Text="请先选择要发送的文件";
suiMessageDialog1->ShowModal();
return;
}

///////////////////////////////////////
接收端是:
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
UUser cmd;
Socket->ReceiveBuf(&cmd,sizeof(cmd));

if(cmd.type==10){
????????????????
}
}

最重要的是问问号里面怎么写呀?我怎么一写就有错

happyct(绿叶对大树的情怀) 你的太麻烦了,简单点就可以了

打开文件用OpenDialog,保存文件用SaveDialog

happyct 2005-04-12
  • 打赏
  • 举报
回复
Client.cpp

//---------------------------------------------------------------------------
// CLIENT端
//
// 贾佳,jiasys@21cn.com
//---------------------------------------------------------------------------

#include <vcl.h>
#include <winsock.h>
#define BUFFSIZE 1024
#pragma hdrstop

#include "Client.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

WSADATA wsa;
SOCKET sck;
SOCKADDR_IN tto;
hostent *host;
fd_set FdRead;
int port=926,ret,i;
DWORD dwRead;


//---------------------------------------------------------------------------
// ReadClient
//
// 接收文件数据线程,判断建立文件关键字,每次将实际读到的数据写入文件。
//
//---------------------------------------------------------------------------

DWORD WINAPI ReadClient(LPVOID lParam)
{
HANDLE hFile;
DWORD dwWrite,dwFileSize;
TCHAR szFileName[MAX_PATH];
TCHAR szBuff[BUFFSIZE];

FD_ZERO(&FdRead);
FD_SET(sck,&FdRead);

while(TRUE)
{
ret=select(0,&FdRead,NULL,NULL,NULL);
if(ret==SOCKET_ERROR)
{
closesocket(sck);
return FALSE;
}
else if(FD_ISSET(sck,&FdRead))
{
ZeroMemory(szBuff,sizeof(szBuff));
if((dwFileSize=recv(sck,szBuff,BUFFSIZE,0))==SOCKET_ERROR)
{
closesocket(sck);
CloseHandle(hFile);
return FALSE;
}
else if((strncmp(szBuff,"DOWNFILE_",lstrlen("DOWNFILE_")))==0)
{
wsprintf(szFileName,"c:\\%s",szBuff);
hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);

if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Cli Open File Error",NULL,MB_OK);
return FALSE;
}
ZeroMemory(szBuff,sizeof(szBuff));
}
else
WriteFile(hFile,szBuff,dwFileSize,&dwWrite,NULL);
}
}
return TRUE;
}

//---------------------------------------------------------------------------
// WriteClient
//
// 发送文件数据线程,每次预读1K数据,根据实际读取发送,直到读取数据小于1K
//
//---------------------------------------------------------------------------

DWORD WINAPI WriteClient(LPVOID szFileName)
{
HANDLE hFile;
DWORD dwRead,dwNdx;
BOOL bRet;
TCHAR szFileBuff[BUFFSIZE],szSend[MAX_PATH];

wsprintf(szSend,"UPFILE_%s",ExtractFileName((LPCTSTR)szFileName).c_str());
send(sck,szSend,lstrlen(szSend),0);
hFile=CreateFile((LPCTSTR)szFileName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);

if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Open File Error",NULL,MB_OK);
ExitProcess(0);
}

do
{
bRet=ReadFile(hFile,szFileBuff,BUFFSIZE,&dwRead,NULL);
if(bRet==FALSE)
{
MessageBox(NULL,"Read Buf ERROR!",NULL,MB_OK);
break;
}
else if(dwRead==0)
{
MessageBox(NULL,"File EOF!",NULL,MB_OK);
break;
}
else
{
send(sck,szFileBuff,dwRead,0);
}
}while(dwRead==BUFFSIZE);

CloseHandle(hFile);
return TRUE;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;

WSAStartup(MAKEWORD(1,1),&wsa);
sck=socket(AF_INET,SOCK_STREAM,0);

if(sck==INVALID_SOCKET)
{
ShowMessage("Could not create a sock");
ExitProcess(0);
}

else
{
host=gethostbyname(Edit1->Text.c_str());
tto.sin_family=AF_INET;
tto.sin_port=htons(port);
CopyMemory(&tto.sin_addr,host->h_addr,host->h_length);
if((connect(sck,(struct sockaddr FAR *)&tto,sizeof(tto))==SOCKET_ERROR))
{
ShowMessage("connect error!");
closesocket(sck);
}

else
{
hThread=CreateThread(NULL,0,ReadClient,(LPVOID)0,0,&dwTid);
CloseHandle(hThread);
}
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;

if(OpenDialog1->Execute())
{
hThread=CreateThread(NULL,0,WriteClient,(LPVOID)OpenDialog1->FileName.c_str(),0,&dwTid);
CloseHandle(hThread);
}
}
//---------------------------------------------------------------------------

happyct 2005-04-12
  • 打赏
  • 举报
回复
Server.cpp

//---------------------------------------------------------------------------
// SERVER端
//
// 贾佳,jiasys@21cn.com
//---------------------------------------------------------------------------

#include <vcl.h>
#include <winsock.h>
#define BUFFSIZE 1024
#pragma hdrstop

#include "Server.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

WSADATA wsaData;
SOCKET sck,sc;
SOCKADDR_IN to,client;
BOOL flag=TRUE;
int iAddrSize,ret,ret_no,i=0;
TCHAR szBuf[BUFFSIZE];
fd_set FdRead;

//---------------------------------------------------------------------------
// ReadClient
//
// 接收文件数据线程,判断建立文件关键字,每次将实际读到的数据写入文件。
//
//---------------------------------------------------------------------------

DWORD WINAPI ReadClient(LPVOID lPort)
{
HANDLE hFile=NULL;
DWORD dwWrite,dwFileSize;
TCHAR szFileName[MAX_PATH];

FD_ZERO(&FdRead);
FD_SET(sck,&FdRead);

while(TRUE)
{
ret_no=select(0,&FdRead,NULL,NULL,NULL);
if(ret_no==SOCKET_ERROR)
{
closesocket(sck);
return FALSE;
}

if(FD_ISSET(sck,&FdRead))
{
iAddrSize=sizeof(client);
sc=accept(sck,(SOCKADDR *)&client,&iAddrSize);
if(sc==INVALID_SOCKET)
{
MessageBox(NULL,"accept error",NULL,MB_OK);
closesocket(sc);
WSACleanup();
}
getpeername(sck,(SOCKADDR *)&client,&iAddrSize);
ShowMessage(inet_ntoa(client.sin_addr));
FD_SET(sc,&FdRead);
}

if(FD_ISSET(sc,&FdRead))
{
ZeroMemory(szBuf,sizeof(szBuf));
if((dwFileSize=recv(sc,szBuf,BUFFSIZE,0))==SOCKET_ERROR)
{
closesocket(sc);
CloseHandle(hFile);
return FALSE;
}
else if((strncmp(szBuf,"UPFILE_",lstrlen("UPFILE_")))==0)
{
wsprintf(szFileName,"c:\\%s",szBuf);
hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);

if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Server Open File Error",NULL,MB_OK);
return FALSE;
}
ZeroMemory(szBuf,sizeof(szBuf));
}
else
WriteFile(hFile,szBuf,dwFileSize,&dwWrite,NULL);
}
}
CloseHandle(hFile);
return TRUE;
}

//---------------------------------------------------------------------------
// WriteClient
//
// 发送文件数据线程,每次预读1K数据,根据实际读取发送,直到读取数据小于1K
//
//---------------------------------------------------------------------------

DWORD WINAPI WriteClient(LPVOID szFileName)
{

HANDLE hFile;
DWORD dwRead,dwNdx;
BOOL bRet;
TCHAR szFileBuff[BUFFSIZE],szSend[MAX_PATH];

wsprintf(szSend,"DOWNFILE_%s",ExtractFileName((LPCTSTR)szFileName).c_str());
send(sc,szSend,lstrlen(szSend),0);
hFile=CreateFile((LPCTSTR)szFileName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);

if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Open File Error",NULL,MB_OK);
ExitProcess(0);
}

do
{
bRet=ReadFile(hFile,szFileBuff,BUFFSIZE,&dwRead,NULL);
if(bRet==FALSE)
{
MessageBox(NULL,"Read Buf ERROR!",NULL,MB_OK);
break;
}
else if(dwRead==0)
{
MessageBox(NULL,"File EOF!",NULL,MB_OK);
break;
}
else
{
send(sc,szFileBuff,dwRead,0);
}
}while(dwRead==BUFFSIZE);

CloseHandle(hFile);
return TRUE;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;

if(OpenDialog1->Execute())
{
hThread=CreateThread(NULL,0,WriteClient,(LPVOID)OpenDialog1->FileName.c_str(),0,&dwTid);
CloseHandle(hThread);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;

if(WSAStartup(MAKEWORD(1,1),&wsaData)!=NULL)
{
ShowMessage("初始化WINSOCK错误");
WSACleanup();
}

if((sck=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
{
ShowMessage("SOCKET错误");
closesocket(sck);
WSACleanup();
}

to.sin_family=AF_INET;
to.sin_port=htons(926);
to.sin_addr.s_addr=htonl(INADDR_ANY);

if(setsockopt(sck,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&flag,sizeof(flag))==SOCKET_ERROR)
{
ShowMessage("setsockopt error!");
closesocket(sck);
}


if(bind(sck,(struct sockaddr *)&to,sizeof(to))==SOCKET_ERROR)
{
ShowMessage("Could not bind");
closesocket(sck);
}

else
{
listen(sck,1);
hThread=CreateThread(NULL,0,ReadClient,(LPVOID)0,0,&dwTid);
CloseHandle(hThread);
}
}
//---------------------------------------------------------------------------

海嵌 2005-04-12
  • 打赏
  • 举报
回复
void __fastcall TFileUDP::RecvFile(char *filename) //接收文件
{
StrCopy(FileName,filename) ;
FStream=new TFileStream(FileName,fmCreate|fmShareDenyNone);//建立文件
Send_CF_COM(CF_NAMER,0);//自定义接受
return;
}

void __fastcall TFileUDP::Send_CF_COM(char Command,int Position)
{
S_FCOM fcom;
。。。
。。。
。。。
Socket1.UDPSendto(Form2->Handle,Form2->Info.NowPort,(char *)&fcom,sizeof(S_FCOM));
}
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧