社区
C++ Builder
帖子详情
Socket的10049错误问题求教!
yy2001
2004-06-16 04:12:09
我做了个Socket通讯程序,与另一程序进行交互,程序每搁一定时间检查ClientSocket的连接情况并使之保持连接,但我发现TClientSocket每隔几分钟(大约5分钟)就会有一个10049错误,虽然发生错误并没有影响程序对数据的发送和接收,但由于程序要一直运行着,我怕时间一长出现问题,请问应如何解决?
...全文
3460
46
打赏
收藏
Socket的10049错误问题求教!
我做了个Socket通讯程序,与另一程序进行交互,程序每搁一定时间检查ClientSocket的连接情况并使之保持连接,但我发现TClientSocket每隔几分钟(大约5分钟)就会有一个10049错误,虽然发生错误并没有影响程序对数据的发送和接收,但由于程序要一直运行着,我怕时间一长出现问题,请问应如何解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Socket
编程快速入门
本课程将理本课程将理啊 论结合实践,带你从零开始,系统学习
Socket
编程技术,让
Socket
的学习不再那么零散与难以掌握,同时会提炼出
Socket
网络传输的核心思想与构架,并带你踩坑出坑,增加你的分析与处理
问题
的啊aasa 能力,完善你的编程思想与知识体系。论结合实践,带你从零开始,系统学习
Socket
编程技术,让
Socket
的学习不再那么零散与难以掌握,同时会提炼出
Socket
网络传输的核心思想与构架,并带你踩坑出坑,增加你的分析与处理
问题
的能力,完善你的编程思想与知识体系。
小妹
求教
!IPV6下的udp网络编程
问题
!(转)
小妹
求教
!IPV6下的udp网络编程
问题
!(转)[@more@]请教各位高手大哥,我以一个ipv6下的tcp客户端程序为基础,想改为udp客户端程序,因为对ipv6理解很浅,现编译完后有些
问题
解决不了,清大家帮我改改哪里不对,谢...
socket
bind失败linux,linux下
socket
编程总是bind异常。
求教
~
C/C++ code#include "sender.h"#include "reader.h"#include "../DMS_serverMain.h"#include /** @brief sender** @todo: document this function*/sender::sender(DMS_serverFrame* frame){int rval;this->m_pfr...
c语言 读ttl
socket
,新人求助,我在写
socket
编程时遇到的一个奇怪的
问题
该楼层疑似违规已被系统折叠隐藏此楼查看此楼我在用
socket
的API写一个traceroute的程序,发送的是ICMP数据包,完成后发现程序跑两三遍没
问题
,但是之后的话,程序便不能运行了,我查看了一下,ICMP的type类型返回了9,应该返回0的,
求教
为什么?总是成功两三遍后就没法运行,重开也没有用,只能重启电脑才行。小弟多谢各位了,顺便吐槽下头衔的名字。程序如下#include "Trace...
java
socket
recv_
socket
下 recv 数据的
问题
def recvMessage(self, sockHandle):#读取来自客户端的数据strings = b""getNullTime = 0client = self.dict
Socket
Handle[sockHandle]num = 1totalLen = 0while True:try:print("第"+str(num)+"次读取数据")data = client.recv(1024)...
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章