使用winsock控件建立两台计算机1,2的联机,实现下列功能:
1)1向2 发送拍照指令,指定2在某一时刻拍照(2上有摄像头,收到拍照指令按照时刻驱动摄像头拍照);2收到拍照指令立即返回一确认指令,表示拍照指令已经收到;
2)图像拍完后,1向2获取图像,2将图像分成一个个文件包,把文件包发给1,1收到后返回ACK,2继续传下一文件包,直至图像传输完毕。出现问题:
 发送拍照指令,拍照确认指令,获取图像及传递文件包这些在顺序执行时都没有问题。但是,如果在传递文件包的过程中,想再次发送一个拍照指令,会出现错误;而且错误不可预知,有时是拍照指令发不出去,有时是拍照指令发出去,但文件传输中断,有时又会正常,既发送出指令,又不耽误文件继续传输。
请问这是什么原因,有什么解决办法吗?恳请各位帮忙。

解决方案 »

  1.   

    最方便的就是使用VB老鸟的办法,要复杂一点,可以重新定义传输协议。
    可以将数据包分成两个部分,一个部分为指令控制区,一个部分为数据区,二者用一串特殊符号间隔,比如:
    xxxxxx----------dddddddd。
    其中“----------”为指令和数据之间的间隔符,一个数据包可以只有指令区而无数据区,也可以只有数据区而无指令区,但间隔符始终存在。每次发送和进行都根据间隔符进行封包和解包,判断接收到的是否为指令或数据或二者皆有,处理顺序为先指令后数据。在发送过程中,如果原来的数据包没有发送完毕,可以用两种方式进行,一是中断上次发送,并立即返回确认;二是继续发送,将新的数据存在缓冲区里,等发送完比之后再发送确认信息,然后发送新的数据。
      

  2.   


    楼主不是这个问题,楼主的包就是包括了指令区和数据区,并非收到的数据无法解析,而是是senddata的同时,如果有数据到达,DataArrival事件无法激活,无法收到数据.
      

  3.   

    我想了两种解决方案,
    一种就是昨晚跟你说的用两个winsock,这种方法缺点是开启端口翻倍,易造成混乱,但是可以提高传输效率,不会出现内网下230454大小的文件都要传输50秒.
    另外,更改协议,传输改为:"消息--响应--响应的响应",如果没有收到"响应的响应",则重发上一条指令..但是这样会使文件传输效率更低.