一个socket客户端等待回应的问题
大家好,小弟我毕业设计用到一些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
[解决办法]
为什么不设置成 传送完了再删除呢?
[解决办法]
重传过程中如果收到了确认,就停止重传,把已经确认的文件删除。这有很多socket例子,实现了一些经典的协议,可参考:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
使用事件对象来控制
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:
...
}
[解决办法]
20秒已经很长了, 如果还没应答就看楼主要怎么处理了