本文分析了飞鸽传输核心传送过程。
-
-
DWORD
WINAPITMainWin::SendFileThread(
void
*_sendFileObj)
-
{
-
SendFileObj*obj=(SendFileObj*)_sendFileObj;
-
fd_setfds;
-
fd_set*rfds=NULL,*wfds=&fds;
-
timevaltv;
-
int
sock_ret;
-
BOOL
ret=FALSE,completeWait=FALSE;
-
-
BOOL
(TMainWin::*SendFileFunc)(SendFileObj*obj)=
-
obj->command==IPMSG_GETDIRFILES?TMainWin::SendDirFile:TMainWin::SendFile;
-
-
FD_ZERO(&fds);
-
FD_SET(obj->conInfo->sd,&fds);
-
-
-
for
(
int
waitCnt=0;waitCnt<180&&obj->hThread!=NULL;waitCnt++)
-
{
-
tv.tv_sec=1,tv.tv_usec=0;
-
-
-
-
-
if
((sock_ret=::select(obj->conInfo->sd+1,rfds,wfds,NULL,&tv))>0)
-
{
-
-
waitCnt=0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
if
(completeWait)
-
{
-
-
if
(::recv(obj->conInfo->sd,(
char
*)&ret,
sizeof
(ret),0)>=0)
-
ret=TRUE;
-
break
;
-
}
-
else
if
((mainWin->*SendFileFunc)(obj)!=TRUE)
-
{
-
-
break
;
-
}
-
else
if
(obj->status==FS_COMPLETE)
-
{
-
-
completeWait=TRUE,rfds=&fds,wfds=NULL;
-
if
(obj->fileSize==0){ret=TRUE;
break
;}
-
}
-
}
-
else
if
(sock_ret==0){
-
-
FD_ZERO(&fds);
-
FD_SET(obj->conInfo->sd,&fds);
-
}
-
else
if
(sock_ret==SOCKET_ERROR){
-
-
break
;
-
}
-
}
-
-
-
if
(obj->isDir)
-
{
-
mainWin->CloseSendFile(obj);
-
while
(--obj->dirCnt>=0)
-
::FindClose(obj->hDir[obj->dirCnt]);
-
}
-
-
-
obj->status=ret?FS_COMPLETE:FS_ERROR;
-
-
-
mainWin->PostMessage(WM_TCPEVENT,obj->conInfo->sd,FD_CLOSE);
-
-
::ExitThread(0);
-
return
0;
-
}
-
上面传送数据最重要的一句是:
else
if
((mainWin->*SendFileFunc)(obj)!=TRUE)
SendFileFunc的实际内容是什么呢?由函数开始赋值的指针知道:
-
-
BOOL
TMainWin::SendFile(SendFileObj*obj)
-
{
-
if
(obj==NULL||obj->hFile==INVALID_HANDLE_VALUE)
-
return
FALSE;
-
-
int
size=0;
-
_int64remain=obj->fileSize-obj->offset;
-
-
-
if
(remain>0&&(size=::send(obj->conInfo->sd,obj->mapAddr+(obj->offset%cfg->ViewMax),remain>cfg->TransMax?cfg->TransMax:(
int
)remain,0))<0)
-
return
FALSE;
-
-
-
obj->offset+=size;
-
-
-
-
if
(obj->offset==obj->fileSize)
-
obj->status=obj->command==IPMSG_GETDIRFILES?FS_ENDFILE:FS_COMPLETE;
-
else
if
((obj->offset%cfg->ViewMax)==0)
-
{
-
::UnmapViewOfFile(obj->mapAddr);
-
remain=obj->fileSize-obj->offset;
-
-
obj->mapAddr=(
char
*)::MapViewOfFile(obj->hMap,FILE_MAP_READ,(
int
)(obj->offset>>32),(
int
)obj->offset,(
int
)(remain>cfg->ViewMax?cfg->ViewMax:remain));
-
}
-
-
obj->conInfo->lastTick=::GetTickCount();
-
-
return
TRUE;
-
}
分享到:
相关推荐
IPMSG飞鸽传书增强版,无单文件5G限制。 可以传任意大小文件,文件夹。内网联系很方便。
IPMSG飞鸽传书,局域网最好的传输和聊天工具,速度超快
IPMSG飞鸽传书经典版,局域网内,消息传递,文件发送的利器
IPMSG飞鸽传书源码
IPMSG飞鸽传书2007 局域网文件传输 IPMSG飞鸽传书2007 IPMSG飞鸽传书2007 IPMSG飞鸽传书2007 简单实用,方便快捷!
飞鸽传书源码阅读,ipmsg飞鸽传书源码
IPMsg 飞鸽传书 C#源码 TCP协议 Sockets 局域网内测试良好 大家可以下载试试看
IPMsg飞鸽传书
IPMSG 飞鸽 飞鸽传书 熟读很快 飞信 IPMSG 飞鸽 飞鸽传书 熟读很快 飞信
很简单好用的传输工具,可以传输文件和文件夹 好东西用了就知道!! 推荐! 完全绿色!
ipmsg_source 飞鸽传书 c++ 源码
IPMSG 飞鸽传书 源代码.rar
- IPMsg 是一款局域网内即时通信软件, 基于 TCP/IP(UDP). 可运行于多种操作平台(Win/Mac/UNIX/Java), 并实现跨平台信息交流. - 不需要服务器支持. - 支持文件/文件夹的传送 (2.00版以上) - 通讯数据采用 RSA...
局域网通讯软件 飞鸽传书源码 初始版本 需要自取
飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书 飞鸽传书
ipmsg代码 飞鸽传书 ipmsg代码 飞鸽传书
IPMSG 飞鸽传书 IP信使 3.32版 简体中文版
飞鸽传书是局域网常用的文件传输工具,传输文件速度快,堪称局域网内的QQ软件