请大家指点一下下面的流程是否正确,以及里面的问题,请给解答一下,谢谢程序的功能,客户端多线程传送文件给服务器,
假设客户端传送文件4*4096+100字节,而每次只能传送4096字节客户端
#define MAXBYTES 4096
main()
{
(1)定义个文件对象打开要传送的文件,获得文件大小4*4096+100
(2)获得需要的线程数4+1=5
(3) for(i=0;i<5;i++)
{
_beginthreadex(..ReadSendFile,i..);
}
//问题:如何判断所有的线程都结束?是不是定一个线程数租arrThread[5]
//然后waiteformultithread(5,arrThread...);
提示发送完毕
}void ReadSendFile(lpvoid)
{
int iSeek=(int)lpvoid
SOCKET sk;
char chBuf[MAXBYTES];
CFile fRead;
Connect(sk...)连接服务器
读取文件从i*4096+1开始,读取长度4096
//问题:用不用判断最后一个线程,读取100字符
//把chBuf定义成为内部变量,不用考虑读取4096字节还没有读完,
//下一线程就来了的情况了吧
//要是定义成全局变量是不是得使用临界区?
发送文件send(sk,chBuf,strlen(chBuf))
}服务器端:
main()
{
(1)监听

while(1)
{
SOCKET sk;
sk=accept();
如果客户端连接成功
_beginthreadex(RecvWrite,sk)开始线程

}
}void RecvWrite(lpvoid)
{
SOCKET SK;
sk=lpvoid
char buffer[MAXBYTES];
recv(sk,buffer,MAXBYTES);
//问题:这里把buffer定义成局部合适吗?
//如果定义成全局变量,又存在着覆盖缓冲区的问题和顺序先后的问题
//并且怎么判断是那次传过来的数据?
//在那里写文件比较好?收到就写吗?那网络发送延迟问题怎么解决?
//怎么跳出main中的while循环,判断所有的数据都受到,以便显示写文件完毕信息
}

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=448
      

  2.   

    不用担心线程函数中的变量buffer、chBuf被覆盖,因为既然是线程函数,
    每个线程都有自己的一份缓冲区,不是公用的,除非你硬写成static,呵呵至于判断数据先后顺序和结束与否的问题,必须自定义包头,写明数据总数量、
    本包顺序、本包长度,服务器端一定要通过这些信息来判断数据是否收全。
      

  3.   

    TO jazy:
    在void RecvWrite(lpvoid)中定义的局部变量char buffer[MAXBYTES];
    接受数据的时候,如果接收到一次数据后就马上写文件,要是有延迟,肯定就不正确了。
    要是接收到所有的数据后再写文件,那么Buffer,怎么引用?不被覆盖吗?
    就是不被覆盖,那么些数据库的write(buffer...),怎么判断是哪个buffer还有main()中的那个while(1)循环,怎么跳出来?
      

  4.   

    while(1)
    {
    SOCKET sk;
    sk=accept();
    如果客户端连接成功
    _beginthreadex(RecvWrite,sk)开始线程
    }
    首先这种思路不对,accept是与客户端connect操作一一对应的,
    如果按照accept一个连接就交给一个线程RecvWrite处理下面所有事情的话,
    RecvWrite必须能够判断这个连接是否接收完毕,而socket并不会保证客户端
    一次send的数据,服务器一次recv能够接收完,好的做法应该是在RecvWrite中
    循环recv,每次recv到数据都要有一个标志判断是否客户端一次send的数据已经全部收到了,
    没收全就应该循环recv。另一个问题,while循环如何退出,简单点可以把while(1)改成while(一个bool变量),
    这个bool变量开始设为true,什么时候主线程想停止侦听,就把bool变量设为false,
    循环就结束了。
      

  5.   

    服务端,你应该accept后在recv
    也可以在while中设一个判断来break
      

  6.   

    to  jazy() ( )
    aceept必须在那个while(1)循环里面吧,不然接受一次connect,就不能接受了吧。
    那接受了一个connect不开一个线程吗?你能不能用你的思路给我写个大致流程?谢谢下面的程序里面也是那么处理的阿
    http://www.vckbase.com/document/viewdoc/?id=448while(1)
    {
    //新建一个套接字,用于客户端
    SOCKET s1;
    s1=accept(pthis,NULL,NULL);

    //给主函数发有人联入消息
    CString aa;
    aa="一人联入!\n";
    AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
    aa.ReleaseBuffer();
    DWORD dwthread;
    //建立用户线程
    ::CreateThread(NULL,0,clientthread,(LPVOID)s1,0,&dwthread);
    }
      

  7.   

    什么时候主线程想停止侦听,就把bool变量设为false这个怎么做?在那儿比较好?
      

  8.   

    to : oyljerry(☆勇敢的心☆) ( )
    accept后recieve,怎么用多线程阿
      

  9.   

    accept以后把socket对象post给处理线程,该线程循环等待FD_READ消息,
    有消息时候就recv,每次recv到缓冲区后判断一下是不是完整,完整了就进行处理。