Socket的10049错误问题求教!

yy2001 2004-06-16 04:12:09
我做了个Socket通讯程序,与另一程序进行交互,程序每搁一定时间检查ClientSocket的连接情况并使之保持连接,但我发现TClientSocket每隔几分钟(大约5分钟)就会有一个10049错误,虽然发生错误并没有影响程序对数据的发送和接收,但由于程序要一直运行着,我怕时间一长出现问题,请问应如何解决?
...全文
3460 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
yesry 2004-06-25
  • 打赏
  • 举报
回复
jsp 说了那么多,我都没有耐性教了。

问题要一个一个排查
首先解决100049,最近DSN系统总是遭受病毒攻击,如果地址是域名,不是IP地址,那就情有可原了。

其次地址错误,出现0地址读写,codeguard写不下来是可能的。地址错误是通讯程序经常要面对的问题,无论如何,你应该逐行检查这样的操作,因为那是致命的。除了jsp说的那样看看是否有地址没有初始化,还要检查写超界。

另外ClientSocket建议用Active=true,false,不要Open(),Close();
yy2001 2004-06-24
  • 打赏
  • 举报
回复
程序运行期间的具体过程实际上是由Synchronize过程通知主线程,然后主线程在适当的时机来执行Synchronize过程参数列表中的过程。在多个线程的情况下,主线程将Synchronize过程发的通知放到消息队列中,然后逐个的响应这些消息。通过这种机制实现线程间的同步。

这是书上的话。

在处理消息队列中的消息时,如果有高优先级的消息加入到队列中,不是将低优先级的消息挂起,先处理优先级高的消息吗?
jishiping 2004-06-24
  • 打赏
  • 举报
回复
当子线程里调用Synchronize函数时,它会设置一个TEvent,开始时这个TEvent时没有信号的,子线程就调用API函数TEvent的WaitFor在那儿等待信号。主线程执行完My_Exec中的代
码后,会将TEvent设置为有信号的状态,于是子线程等到信号了,Synchronize函数就执行
完了。
jishiping 2004-06-24
  • 打赏
  • 举报
回复
楼主嘴上说知道,实际上一点不知道。已经说了,里上面的写法,My_Exec 是由主线程执行
的,和子线程一点关系都没有。主线程在执行My_Exec时,子线程就在那儿等待主线程执行完
毕。

另外,主线程在执行My_Exec中的代码,又怎么可能会处理其它的消息?除非里在My_Exec中
调用了Application->ProcessMessages(); 所以楼主其实一点都不懂TThread的Synchronize
的用法。我说了半天,楼主还是不明白。
yy2001 2004-06-24
  • 打赏
  • 举报
回复
我用的是BCB5,那是否可以达到那种效果呢?
yy2001 2004-06-24
  • 打赏
  • 举报
回复
我是说当主线程执行My_Exec的代码时,如果主线程又有其它消息需要处理,主线程是否会因为My_Exec所在线程的优先级低而暂停执行My_Exec而是处理主线程内的消息,处理完成后在继续执行My_Exec?
另外,上面的线程用法是否有问题?
jishiping 2004-06-24
  • 打赏
  • 举报
回复
不明白里上面说什么。你的Thread的Execute()其实不执行任何有意义的代码(主要就是等待),无论优先级是什么,基本上都没有任何影响。
yy2001 2004-06-24
  • 打赏
  • 举报
回复
这个我知道,我是想线程的操作不影响主线程工作,将线程设置了低的优先级,是否能达到这个效果?
jishiping 2004-06-24
  • 打赏
  • 举报
回复
对于BCB6的Synchronize过程,它是不发消息的。它是将一个东西直接放到一个队列中(不是
消息队列),然后就在那儿等待。然后由主线程的消息处理函数主动去检查这个队列。你上面
说的,和BCB5的处理方法有点类似。
jishiping 2004-06-24
  • 打赏
  • 举报
回复
建议你看看源程序。对于Synchronize过程的实现,BCB5和BCB6实现的方法不同。我上面说的是BCB6的处理情况(现在一般用BCB6,很少用BCB5了)。
ahaozi 2004-06-24
  • 打赏
  • 举报
回复
这么多人说了,我没有什么好说的了,接分了!
yy2001 2004-06-23
  • 打赏
  • 举报
回复
发现一个奇怪的问题,关闭CodeGuard后,程序运行一段时间后报地址错误:“Access violation at address41004496.Write of address 00000000”
但将CodeGuard选中打开后运行并不错误,为什么呢?
jishiping 2004-06-23
  • 打赏
  • 举报
回复
使用TThread的Synchronize函数时,这个函数的参数指向的函数(这儿就是My_Exec)代码,
是由主线程执行的,线程在那儿等待,直到主线程执行完My_Exec的代码之后,线程才继续
往下执行。由于这儿TMyThreadSubmit::Execute()实际上只有一句Synchronize(My_Exec);
而My_Exec函数是被放在主线程执行的,所以说等于没有使用线程。
yy2001 2004-06-23
  • 打赏
  • 举报
回复
哦,您是说Synchronize执行时主线程停止响应?
那我通过设置优先级是否可以呢?我上面的用法是否有问题?
yy2001 2004-06-23
  • 打赏
  • 举报
回复
为什么等于没有使用线程?我是这样用的:
Thread:
TMyThreadSubmit *MyThreadSubmit;
__fastcall TMyThreadSubmit::TMyThreadSubmit(bool CreateSuspended)
: TThread(CreateSuspended)
{ }
//------------------------------------------------------------------------void __fastcall TMyThreadSubmit::Execute()
{
FreeOnTerminate=true;
Synchronize(My_Exec);
}

cpp:
#include "cpp_thread_submit.h"
if(MyThreadSubmit)
{
MyThreadSubmit->Terminate();
MyThreadSubmit->WaitFor();
MyThreadSubmit=NULL;
}
MyThreadSubmit=new TMyThreadSubmit(false);
MyThreadSubmit->Priority=tpLowest;
jishiping 2004-06-23
  • 打赏
  • 举报
回复
如果上面的线程的Execute函数只有这两行,那么这样的线程,等于没有使用线程,My_Exec
中的代码,和直接放在主线程里的效果一样。
yy2001 2004-06-23
  • 打赏
  • 举报
回复
程序启动后只是定时有SOCKET发送连接信息,并没有其他操作,应该不是程序没执行到。

报错后光标不定的停在我的某个线程的
void __fastcall TMyThread::Execute()
{
//---- Place thread code here ----
FreeOnTerminate=true;
Synchronize(My_Exec); //这个位置
}
那是我的线程执行函数My_Exec有问题吗?
jishiping 2004-06-23
  • 打赏
  • 举报
回复
上面的CodeGuard信息,表明在程序执行的过程中,CodeGuard没有发现错误,但是不代表程序
没有问题。比如有问题的地方(比如某个函数有问题),你在测试的时候,并没有让程序执行
到这儿,此时CodeGuard当然不会发现错误了。
jishiping 2004-06-23
  • 打赏
  • 举报
回复
就是说,有个变量,可能没有赋值,就变成随机数了(一般是编译时就决定了),所以有时
访问0指针,有时又没事。
yy2001 2004-06-22
  • 打赏
  • 举报
回复
我用如下的代码,并没有跳出提示,只能在ClientSocket的OnError中可以得到错误号。那问题应该在哪呢?
void __fastcall Tfrm_main::Timer1Timer(TObject *Sender)
{
if(!Client->Active)
{
try{
Client->Address = Gateway_Add;
Client->Port = Gateway_Port;
Client->Active=true;
}
catch(...)
{
ShowMessage("请检查线路!");
}
}
加载更多回复(26)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧