大家好,小弟我毕业设计用到一些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
程序的客户端通过串口得到数据,存为一个个的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
解决方案 »
- 如何禁止U盘启动(非注册表)
- 窗口的静态三叉拆分,哪里出错了
- WIN7下copyfile返回成功但是文件却没有copy到相应的目录
- vc显示.dat格式的图像
- select语句用在odbc中的问题,,,SOS
- Report类型的ListCtrl控件的标题栏的各个值怎么读啊?分不是问题,先来先得,到解决为止,人人有分
- 请问在VC中能否通过IDE环境直接定制菜单资源的OwnerDraw属性?
- C++,类中给另一个类赋值时出现“错误: 无法计算表达式的值”,是不是空间分配错误?怎么分配类的空间?
- 请教一下如何写虚拟串口程序
- 大家来捡分啊!!
- 无法打开文件“opencv_core242.lib”//刚配置完,不知道是那步的错误?
- 继承之后怎样屏蔽父类的成员函数?
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:
...
}
用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
20秒已经很长了, 如果还没应答就看楼主要怎么处理了
用事件比较灵活,我那个sleep真是不太靠谱,但是waitforsingleobject 20000毫秒以后还是没有应答怎么办???重传吗?还是将20000改为无限等待???
20秒已经很长了, 如果还没应答就看楼主要怎么处理了
你说的很对~~~结贴。