2010-06-04 33 views
0

我有一个基于选择的服务器。套接字处于阻塞模式,但对于select()函数,我使用250 ms。时间到。Winsock Select()函数给出0xC00000FD异常

基本上我的服务器只接受一个客户端并将数据发送到该客户端。 如果我只是将数据从服务器发送到客户端,它可以正常工作数周。

但我意识到,如果客户端在select()行3-4小时后向服务器发送数据,它会发生堆栈溢出异常(0xC00000FD)。 我红了几十倍Select()的MSDN页面,但是没有提到与此有关。 我真的被卡住了。任何帮助将不胜感激。

顺便说一下,我发现在网上,例如;在接受客户端连接后

http://tangentsoft.net/wskfaq/examples/basics/select-server.cpp

在这里,他将其设置为非阻塞模式。 它被评论说,

// Mark the socket as non-blocking, for safety. 

上面的“安全”是什么意思? 那么你认为这是我的问题吗?因为在我的实现中,连接的模块处于阻塞模式?

在此先感谢

回答

1

例外意味着您的代码中存在一个错误。由于你得到了堆栈溢出,你的代码中可能会有一个递归循环运行时间过长,每次调用都会占用堆栈空间,直到没有剩余堆栈空间。在正常情况下,select()会在失败时返回一个错误代码,所以你必须把程序的内存搞乱才会出现异常。

+0

嗨雷米, 感谢您的回复。但问题是有一个循环用select()调用进行轮询。所以没有递归函数调用。如果客户端不发送任何数据,则完全没有问题。但是,如果它发送数据,4-5小时后它会在select()函数中发生缓冲区溢出。如果有帮助,我可以发布伪代码? – AFgone 2010-06-08 09:54:51

+0

然后你不太可能得到堆栈溢出。缓冲区溢出是完全不同的东西。不过,这确实听起来像是你错误地管理你的代码。所以是的,请显示一些实际的代码。 – 2010-06-08 22:08:13