开了一个县城使用socket接收数据,并将接收到的数据放到一个缓冲区中;
又开了一个县城从这个缓冲区中读取数据;
但接收数据的缓冲区有时会莫名其秒的当掉,有时甚至导致整个程序退出,使用GetLastError()又得不到什么错误,唉,真的好奇怪,是县城的问题还是SOCKET的问题呢?
9 个解决方案
#1
缓冲区是临界资源,应该加锁。
#2
: anjy(泡泡oοО○)
谢谢,我用了mutex,可以吗?
谢谢,我用了mutex,可以吗?
#3
应该是线程的问题吧!
#4
我用了mutex了,也用waitforsingleobject()了.
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;
我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?
这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;
我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?
这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!
#5
前一段时间同样遇到这样的问题,或许能提供些有价值的资料,但我需要以下信息:
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。
#6
程序运行的环境:
1.单cpu :p4 1.70 memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动
1.单cpu :p4 1.70 memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动
#7
我以前的鸡子装了个防火墙,socket也是总是奇怪的断~~~ , debug看堆栈发现是死在ndis层里了~~~
冬冬的每个socket线程都有自己的缓冲区对象,
每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
据"X.T & X.P 's Delphi 5 Developer's Guide "
提示 临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。
冬冬的每个socket线程都有自己的缓冲区对象,
每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
据"X.T & X.P 's Delphi 5 Developer's Guide "
提示 临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。
#8
我的机子可没firewall
#9
建议你使用EnterCriticalSection和LeaveCriticalSection
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。
#1
缓冲区是临界资源,应该加锁。
#2
: anjy(泡泡oοО○)
谢谢,我用了mutex,可以吗?
谢谢,我用了mutex,可以吗?
#3
应该是线程的问题吧!
#4
我用了mutex了,也用waitforsingleobject()了.
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;
我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?
这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;
我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?
这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!
#5
前一段时间同样遇到这样的问题,或许能提供些有价值的资料,但我需要以下信息:
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。
#6
程序运行的环境:
1.单cpu :p4 1.70 memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动
1.单cpu :p4 1.70 memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动
#7
我以前的鸡子装了个防火墙,socket也是总是奇怪的断~~~ , debug看堆栈发现是死在ndis层里了~~~
冬冬的每个socket线程都有自己的缓冲区对象,
每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
据"X.T & X.P 's Delphi 5 Developer's Guide "
提示 临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。
冬冬的每个socket线程都有自己的缓冲区对象,
每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
据"X.T & X.P 's Delphi 5 Developer's Guide "
提示 临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。
#8
我的机子可没firewall
#9
建议你使用EnterCriticalSection和LeaveCriticalSection
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。