请问完成端口中客户端如何向服务器端上传文件

gracezhu 2006-09-03 10:45:44
文本的交互已经可以实现,现在主要是上传文件的问题。是拆分包传过去服务器端组包还是其他的方法,请大家给出意见,3ks
...全文
290 点赞 收藏 11
写回复
11 条回复
ZHENG017 2006年09月14日
transmitfile.os没有规定只有server才能用transmitfile吧.
回复 点赞
尘雨 2006年09月13日
如果在客户端使用完成端口模型来WSASEND到服务端,对于传输文件,不需要分包,直接WSASend所有的字节,利用IOCP模型内部的机制会把它传递到socket缓冲区,并且send到服务端。因为是异步的,所以WSASend不会堵塞,主线程和界面不会受到影响,只不过在客户端的工作线程中,得到的完成通知的已发送字节数不一定是所有的,这里就需要再次提交WSASend剩下的字节数(一定是剩下的所有字节数)。
这样做的好处是,一次投递所有字节,会保证字节的相对顺序,而且IOCP内部的调度比起你自己分包WSASend要高效和具有伸缩性。
如果你对一个客户端,还使用分包同时投递多次WSASend,根本就没有必要用IOCP,IOCP内部已经协调的很好了,他的目的就是要你把要传得数据一次投递,根据完成通知来决定是否继续投递为完成发送的字节数。
回复 点赞
softrain 2006年09月04日
客户端还要用到完成端口?完全没必要。窗口异步模型就足够了.
回复 点赞
一剑 2006年09月04日
#include <afxinet.h>
//assumes server and file names have been initialized
CInternetSession session("My FTP Session");
CFtpConnection* pConn = NULL;

pConn = session.GetFtpConnection(lpszServerName);
//get the file
if (!pConn->PutFile(pstrLocalFile, pstrRemoteFile))
//display an error
delete pConn;
session.Close();
回复 点赞
stavck 2006年09月04日
一般都是分块传输,包头中添加一个ID用于标识各个包的顺序。
回复 点赞
DentistryDoctor 2006年09月04日
对于此问题,在Socket层面上与传输一般的二进制数据无异。一般需要将文件分拆,接收端进行组合成文件。
回复 点赞
stavck 2006年09月04日
http://blog.csdn.net/stavck/archive/2006/08/31/1150702.aspx
回复 点赞
acejoy 2006年09月04日
TransmitFile最好。
回复 点赞
stavck 2006年09月04日
那个例子我看过,初学的话有些帮助,要想做完成端口服务器,还差很远很远。
那个例子中,你需要在DataAction函数中判断是那个客户端传过来的数据,然后向相应的文件中写入收到的数据。
不建议用那个例子去构建你自己的服务器。
你搜索一下这个论坛,曾经有很多讨论。
回复 点赞
gracezhu 2006年09月04日
谢谢大家的意见,再把我的问题说明一下:
我使用的IOCP例子是:
http://www.vczx.com/article/show.php?id=638
这里面实现了echo的功能,我现在是想将其扩展为客户端可以向服务器端传送文件,(当然服务器向客户端发送文件,使用TransmitFile,这个较简单)
但在这个CompletionPortModel类里面
我现在还不清楚怎么在完成端口处理线程处理文件的接收。
它的部分示例代码如下:
DWORD __stdcall CompletionRoutine(LPVOID Param)
{
switch(lpPerIoContext->IoOperation)
{
case IoRead:
pThis->HandleData(lpPerIoContext, IO_READ_COMPLETION);
bSuccess = pThis->DataAction(lpPerIoContext, lpNewperHandleContext);
if (FALSE == bSuccess)
{
continue;
}
。。。
}
}
}
回复 点赞
IT有个圈儿 2006年09月03日
帮顶!JF!学习!看楼下的!
回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

7880

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告