大家好,小弟我毕业设计用到一些socket编程的知识,现在遇到了一些问题,想请教大家。。
程序的客户端通过串口得到数据,存为一个个的txt文件,同时用链表记录要发送文件的标号,然后开一个发送线程和接收线程,比如我要发送data1.txt---data10.txt,发送data1.txt后等待了三秒,如果接收线程得到了确认标志,就把链表第一个结点(就是data1.txt标号)和data1.txt文件删除。但问题就是:如果没有得到确认,准备重传data1.txt时这个时候又得到了确认信息,结果文件被删除了对于这个时间控制不好,我的客户端程序大概结构是这样
sendproc://发送线程
while(true)
{
senddata(list.firtnode);
sleep(3000); //....3秒似乎不够,但我也不知道要几秒
}rcvproc://接收线程
switch(cmd.id)
{
case rcv_success:
 delete list.firstnode;
case recv_failed:
case other_control_info:
...
}本来是想发送完后又阻塞接收的,但由于服务端要发送其他一些控制信息,如果在senddata后调用一次recv,又可能接收到的是别的控制信息。估计只能senddata后 
while(not_file_rcv_info(cmd.id))//如果不是文件确认信息就一直循环
{
  recv();
  switch(cmd.id) 
  .....
}
总感觉不太好,因为如果这样,控制信息就只能在这个while里得到,不知道大家是否有更好的方法~~谢谢!socket

解决方案 »

  1.   

    重传过程中如果收到了确认,就停止重传,把已经确认的文件删除。这有很多socket例子,实现了一些经典的协议,可参考:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  2.   

    使用事件对象来控制
    static HANDLE s_ListenRecvRet =  CreateEvent(NULL,FALSE,FALSE,NULL);
    sendproc://发送线程
    while(true)
    {
    senddata(list.firtnode);
    WaitForSingleObject(s_ListenRecvRet, 20000);
    }rcvproc://接收线程
    switch(cmd.id)
    {
    case rcv_success:
     delete list.firstnode;
     SetEvent(s_ListenRecvRet);
    case recv_failed:
    case other_control_info:
    ...
    }
      

  3.   


    用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
      

  4.   


    用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
    20秒已经很长了, 如果还没应答就看楼主要怎么处理了
      

  5.   


    用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
    20秒已经很长了, 如果还没应答就看楼主要怎么处理了
    你说的很对~~~结贴。