客户端向服务器发送文件,用的是TCP协议,允许同时发送多个文件
客户端代码大致是这样:POSITION pos = dlg.GetStartPosition();
while(pos )
{
m_strPath = dlg.GetNextPathName(pos);
CFile file(m_strPath, CFile::modeRead);
        //发送文件头给服务器
         //-------------------------------------------(1)
}服务器端在接受到文件头后,发送消息给客户端,客户端发送数据部分给服务器。我的问题是:发送第一个文件时,如何使客户端程序在(1)处暂停一会,等第一个文件发送完毕后,while循环再开始发送第二个文件

解决方案 »

  1.   

    暂停可以用Sleep,不过不需要暂停,应该由服务器端接收时把文件头和数据分离开,也可以先接收文件头。另外提一下,即使暂停一段时间,在服务器端还是可能会在一次recv中同时接收到文件头和数据。
      

  2.   

    主要看你的socket是阻塞的还是非阻塞的。
    发送给服务器的时候,应包含文件名和文件长度。
    服务器开辟内存,接受数据,最后保存为文件。
      

  3.   

    用的是非阻塞的
    发送文件长度有什么作用?检验是否发送成功吗?另:如果我发送多个文件,是一个一个发还是一起发?我上面写的是一个一个发,所以发送第一个时想让while停下来
      

  4.   

    用一个变量控制试试,服务器接收一个文件完毕后向客户端发送一个接受完毕的消息,客户端接收到这个消息,把这个变量再置为TRUE,继续发送第二个文件头static BOOL bStart = TRUE;POSITION pos = dlg.GetStartPosition();
    while(pos )
    {
        m_strPath = dlg.GetNextPathName(pos);
        CFile file(m_strPath, CFile::modeRead);
        while(1)
        {
            if(bStart)
            {
                //发送文件头
                  bStart = FALSE;
                  break;
            }
        }
    }如果这样影响主程序的运行,可以开一个线程来处理,也可以在while(1)里面第一行加个Sleep(0);试试.
      

  5.   

    CreateEvent
    SetEvent
    WaitForSingleObject
      

  6.   


    POSITION pos = dlg.GetStartPosition();
    while(pos )
    {
        m_strPath = dlg.GetNextPathName(pos);
        CFile file(m_strPath, CFile::modeRead);
        WaitForSingleObject(...);
        //发送文件头给服务器
    }
      

  7.   

    这个用阻塞的SOCKET超简单实现嘛POSITION pos = dlg.GetStartPosition();
    while(pos )
    {
        m_strPath = dlg.GetNextPathName(pos);
        CFile file(m_strPath, CFile::modeRead);
        send(filehead);    recv(serverready);
        assert(serverready == true);     while(1)
        {
            send(filedata);
        }
    }