首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个socket客户端等待回应的有关问题

2013-07-01 
一个socket客户端等待回应的问题大家好,小弟我毕业设计用到一些socket编程的知识,现在遇到了一些问题,想请

一个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:
...
}

[解决办法]
引用:
Quote: 引用:

使用事件对象来控制


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:
...
}


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



20秒已经很长了, 如果还没应答就看楼主要怎么处理了

热点排行