socket的一个问题

zxdlms 2007-10-08 11:37:44
在网上很多地方都能搜一个一个Socket传输文件的例子,其中发送文件的时候有一句代码我不明白怎么搞得,希望大家指教一下。

只贴部分代码


UINT uiLength = file.GetLength();
sockSend.Send(&uiLength, 4);//传送文件大小到接收方(Client端)

int iNumByte;
UINT uiTotal = 0;
while(uiTotal < uiLength)
{
int iEnd=pDlg->m_bSendEnd;
//传送发送端状态(是否结束)
iNumByte = sockSend.Send(&iEnd, sizeof(int));
//发送错误
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("发送错误!");
goto ExitLable1;
}
else if(iEnd==1)//发送端终止
{
AfxMessageBox("发送端终止");
goto ExitLable1;
}
//读取文件内容
if((int)(uiLength - uiTotal) < iBufSize)
iSize = uiLength - uiTotal;//当小于缓冲区iTEST时的处理
iSize=file.Read(pBuf , iSize);//得到读取的字节数
int iCount=0;
//发送定长文件数据
while(iCount<iSize)
{
iNumByte = sockSend.Send(pBuf, iSize-iCount);//注意iNumByte为实际的发送字节数,不要以iSize为准
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("发送错误!");
goto ExitLable1;
}
iCount+=iNumByte;
if(iCount<iSize)
{
file.Seek(iSize-iCount,CFile::current); }
}

///////////////就是这句file.seek(),我的理解是如果发送的字节数不足iSize,下次就应该发送pBuf中iCount后的内容啊,为何此处是将文件的指针移位呢???

uiTotal += iCount;
//设置发送数据进度条
pDlg->m_CtrlProgressSend.SetPos(int(((double)uiTotal/uiLength)*100));
str.Format("发送进度:%d%%",int(((double)uiTotal/uiLength)*100));
//表明发送数据百分比
pDlg->GetDlgItem(IDC_STATIC_SEND)->GetWindowText(str1);
if(str1!=str)
pDlg->GetDlgItem(IDC_STATIC_SEND)->SetWindowText(str);
}
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxdlms 2007-10-09
  • 打赏
  • 举报
回复
我知道不会一次全发完啊,但这个代码解释不通啊
while(iCount <iSize)
{
iNumByte = sockSend.Send(pBuf, iSize-iCount);//注意iNumByte为实际的发送字节数,不要以iSize为准
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("发送错误!");
goto ExitLable1;
}
iCount+=iNumByte;
if(iCount <iSize)
{
file.Seek(iSize-iCount,CFile::current);
}
}

假设isize是20,进入循环,第一次发了10,则inumberbyte和icount也为10,小于isize,然后文件指针向后再移10(当前指针已经是读完isize的位置了),本来就没发够isize的字节,还把指针往后移,然后回到
iNumByte = sockSend.Send(pBuf, iSize-iCount),
这里又把pBuf的内容发10,这怎么解释的通呢!!

为什么网上到处都传这个代码呢??



WizardK 2007-10-09
  • 打赏
  • 举报
回复
如果整个代码没有问题,那就是你贴代码的时候有点问题。

从这个代码上看,他是在多次读文件、发送文件内容,这个次数依据文件大小和设定的发送缓冲区大小。每次发送内容时,如果发送没有出错但没有发全,那么在回到第一个while循环的iSize=file.Read(pBuf , iSize)时就需要之前移动文件指针了,将指针移动到已经发送了的位置。
maomaoxu12365 2007-10-09
  • 打赏
  • 举报
回复
是这样的,iSize是读到内存中的字节数,在socket发送数据时,不一定会保证一次就能发送成功,所以用while(iCount <iSize)这个循环不断发,保证iSize个字节全部发完,iNumByte = sockSend.Send(pBuf, iSize-iCount);//注意iNumByte为实际的发送字节数,不要以iSize为准,这句就是这个意思,然后根据实际发送的字节数移动指针,
iCount+=iNumByte;
if(iCount <iSize)
{
file.Seek(iSize-iCount,CFile::current);就是这个意思,实际发了多少字节,就移动多少位置。

你要理解,不要以为Send(pBuf, iSize-iCount),就能发送全部数据。
zxdlms 2007-10-09
  • 打赏
  • 举报
回复
我觉得如果移动了文件指针就应该再读文件到pBuf中,而不应该再有while(iCount<iSize)这个循环。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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