IOCP服务器 监听接收连接部分?

时间:2021-03-18 23:50:51
我的接受连接函数是用的:WSAAccept

我在对我服务器进行压力测试的时候,发现:程序中断在比较底层的代码。
_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
{
#ifdef _M_IX86
    PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;//这里过不去(%100)
    if (!flsGetValue)
    {
        flsGetValue = _decode_pointer(gpFlsGetValue);
        TlsSetValue(__getvalueindex, flsGetValue);
    }
    return flsGetValue;
#else  /* _M_IX86 */
    return NULL;
#endif  /* _M_IX86 */
}


发现%30是从WSAAccept函数这儿发生的。

我就搞不明白了,怎么会出现这个怪异的问题。

我测试的方式是:连接上发送一个命令,等待命令返回,断开连接。
客户端之间的连接请求是有时间间隔的,在这儿我是5毫秒发送一个,即测试软件一秒发送200个连接以及命令。


8 个解决方案

#1


IOCP服务器 监听接收连接部分?

#2


#ifdef _M_IX86//这一行也有问题吧
PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;//这里过不去(%100)
赋值有问题吧

#3


这个函数是在这个文件中:
C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src路径下的tidtable.c文件中。

不是我写的,要是我写的我就不郁闷了。

#4


反正是有一点需要注意:投递请求的时候,OVERLAPPED结构体需有效

#5


有点忘了说明,我这服务器还是能跑一段时间的。
先是1万次测试通过,大概19秒收发完成。
完了我直接给他上1千万次,每次执行的时间是一样的,那样的话就是服务器需要处理完所发的时间多点而已。
可是服务器都撑不到1千万结束的时候,都是在开启运行个10分钟左右就挂了。
都是挂在上面的那个位置,好像是说线程信息出现什么东东吧,我只能查到这些了。

不知道有没有人知道的,指点下我。
烦得很啊。

#6


1、测试的命令是固定,都是登录请求。
2、服务器查询数据库发送请求 结果给测试软件。
3、测试软件收到数据断开连接

3个步骤为一次测试。
测试软件间隔1毫秒发送一次这样的操作。
测试之间都是异步的,这样测试1万次都没有问题。大概19秒

如果1千万次,也就10分钟就挂了。

#7


表面上看是RTL失败,但实际上是程序BUG,你应该看看 CALLSTACK!

#8


这个问题最终都没有解决,可怜啊。

#1


IOCP服务器 监听接收连接部分?

#2


#ifdef _M_IX86//这一行也有问题吧
PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;//这里过不去(%100)
赋值有问题吧

#3


这个函数是在这个文件中:
C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src路径下的tidtable.c文件中。

不是我写的,要是我写的我就不郁闷了。

#4


反正是有一点需要注意:投递请求的时候,OVERLAPPED结构体需有效

#5


有点忘了说明,我这服务器还是能跑一段时间的。
先是1万次测试通过,大概19秒收发完成。
完了我直接给他上1千万次,每次执行的时间是一样的,那样的话就是服务器需要处理完所发的时间多点而已。
可是服务器都撑不到1千万结束的时候,都是在开启运行个10分钟左右就挂了。
都是挂在上面的那个位置,好像是说线程信息出现什么东东吧,我只能查到这些了。

不知道有没有人知道的,指点下我。
烦得很啊。

#6


1、测试的命令是固定,都是登录请求。
2、服务器查询数据库发送请求 结果给测试软件。
3、测试软件收到数据断开连接

3个步骤为一次测试。
测试软件间隔1毫秒发送一次这样的操作。
测试之间都是异步的,这样测试1万次都没有问题。大概19秒

如果1千万次,也就10分钟就挂了。

#7


表面上看是RTL失败,但实际上是程序BUG,你应该看看 CALLSTACK!

#8


这个问题最终都没有解决,可怜啊。