由于我不知道你想干嘛,可能没法发现你的错误。
但我刚看了一下你的代码我有几点疑惑:
1.int isInitial = 0;申明为全局变量
它将导致只有第一个客户,第一个包时执行:
if(isInitial == 0)
{
......
isInitial = 1;
}
代码段。要想每个客户的第一个包都执行,该参数须由线程函数参数带入。
这一步的错误可能导致包解析的非法内存操作。
2.send(sd2, receive, 2778, 0)的用法不太妥。
TCP协议是面向流的协议,它一次发送的字节数,由窗口尺寸确定。
数据包小,不反对你这种用法,但字节大于1024通常是会被撤分的。
由于我未详细看,只能随便说两句。
但我刚看了一下你的代码我有几点疑惑:
1.int isInitial = 0;申明为全局变量
它将导致只有第一个客户,第一个包时执行:
if(isInitial == 0)
{
......
isInitial = 1;
}
代码段。要想每个客户的第一个包都执行,该参数须由线程函数参数带入。
这一步的错误可能导致包解析的非法内存操作。
2.send(sd2, receive, 2778, 0)的用法不太妥。
TCP协议是面向流的协议,它一次发送的字节数,由窗口尺寸确定。
数据包小,不反对你这种用法,但字节大于1024通常是会被撤分的。
由于我未详细看,只能随便说两句。
1、出错是随机的,如果不到10~50hit/s的访问频率,不管访问多少次,都不会出问题。而且出错后,只要不按下“确定”或“取消”按钮,程序仍能“正常”工作;按下按钮后,程序就会退出。
2、此程序是模拟一个数据库服务器,此数据库服务器只需要初始化一次,而此初始化的过程是滞后(Lazy)的,也就是说,当第一次访问发生的时候,才会去干初始化工作。
if(isInitial == 0)部分代码就是模拟初始化过程的。
一个疑问:
在SocketServer的函数里,已经用try……catch把所有代码都包起来了,怎么还会出错呢?