i_sea 发表于 2007-8-22 18:13:53

Socket不能关闭

莫名真的很奇妙

脚本如下:

Action()
{
        buf2=lr_eval_string("<iq id=\"jcl_1\" type=\"get\"><query xmlns=\"jabber:iq:auth\"><username>{Login_Name}</username></query></iq>");

        buf6b=lr_eval_string("<iq id=\"jcl_2\" type=\"set\"><query xmlns=\"jabber:iq:auth\"><username>{Login_Name}</username><resource>CTCQ</resource><compcode>81</compcode><password>");

        buf6a="</password></query></iq>";

        digest="670b14728ad9902aecba32e22fa4f6bd";

        lr_output_message("Login_Name=%s",lr_eval_string("{Login_Name}"));

        lr_output_message("This turn Port is %s",lr_eval_string("{Port}"));

        lrs_create_socket("socket0", "TCP", "RemoteHost=10.80.12.137:5222", LrsLastArg);

        lrs_send("socket0", "buf0", LrsLastArg);

        lrs_receive("socket0", "buf1", LrsLastArg);

        buf=lrs_get_received_buffer ("socket0", 0, -1, NULL);

        lr_output_message("buf1 is %s",buf);

        strcpy(buf,buf2);

        lrs_send("socket0", "buf2", LrsLastArg);

        lr_output_message("buf2 is %s",buf);

        lrs_receive("socket0", "buf3", LrsLastArg);

        buf=lrs_get_received_buffer("socket0",0, -1, NULL);       

        lr_output_message("buf3 is %s",buf);

        strcpy(buf,buf6b);

        strcat(buf,digest);

        strcat(buf,buf6a);

        lr_output_message("buf6 send ID is %d",lrs_set_send_buffer("socket0",buf,strlen(buf)));

        lrs_send("socket0", "buf6", LrsLastArg);

        lr_output_message("buf6 is %s",buf);

        lrs_free_buffer(buf);

        lrs_receive("socket0", "buf7", LrsLastArg);

        buf=lrs_get_received_buffer("socket0",0, -1, NULL);       

        lr_output_message("buf7 is %s",buf);

        lrs_send("socket0", "buf29", LrsLastArg);

        lrs_send("socket0", "buf129", LrsLastArg);

        lr_think_time(30);

        return 0;
}
这是一个CS架构的类似QQ的软件,模拟登录过程,登录成功后发送一个包buf29给一个用户但这不是问题的重点。
运行一次没问题,迭代数目为2或者2以上就会报错,我以为应该是socket链接没有在运行完一次后关闭导致,所以我想在脚本结束之前关闭socket,下次迭代的时候再重新建立一个socket就应该没问题了。
可是我在最后面加上一句话lrs_close_socket("socket0");在runtime中设置迭代次数为2,结果运行到第二次的时候就报错了,错误日志如下:
Action.c(191): lrs_close_socket(socket0)
Action.c(191): Error: An exception was raised while calling invocation function in interpreter extension cciext.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION.
Error: An exception was raised while calling action_logic_call_vuser_run function in extension runlogic.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION.
Ending Vuser...

各位高手帮帮忙,谢谢大家!
不懂啊,为什么就不能加上这句代码呢?socket怎么才能关闭呢?

i_sea 发表于 2007-8-23 09:33:09

兄弟们,没人能解决这个问题么?

lijian422202 发表于 2007-8-23 09:36:34

如果你第一次关闭,没有问题;
第2次也应该没有问题的, 你在关闭前设置一个断点调试下;

一般的错误可能是第2次连接出先问题....你能不能在把问题的特征描述的清楚些

i_sea 发表于 2007-8-23 09:45:32

再描述一下特征:

第一次连接之后,发送登录数据包,成功,发送消息数据包,别的客户端能收到该包,
这样证明第一次登录以及发包都是成功的了,
但是在脚本的最后不能添加结束socket的代码否则程序无法compile通过,
这个样子去继续下一个迭代,
我在第二次迭代中加入一些调试代码,
结果发现服务器送来的包却是第一次迭代时应该发送的包,
比如说第一次迭代我用的用户是张三,第二次迭代用户是李四,结果第二次迭代收到的包还是发给名字叫张三的这个用户的,所以我就觉得是第一次迭代的socket没关闭造成的,所以我想添加结束socket的代码,但是添加这个代码程序会报错就是上面写到的错误。

请大家再帮忙分析一下,为什么一个socket会因为什么样的原因不能关闭?

i_sea 发表于 2007-8-23 12:31:12

这个问题没有解决我是不会让它沉掉的,
这么专业的论坛是不可能解决不了这个问题的。

ppent 发表于 2007-8-23 12:43:26

我的没有问题,是否和你的服务器的socket连接有关。
Action()
{
       lrs_create_socket("socket0", "TCP", "RemoteHost=appsvr01:8080", LrsLastArg);
       lr_think_time(1);
       lr_message("Hello World!");
               lrs_close_socket("socket0");
        return 0;
}

ppent 发表于 2007-8-23 12:45:59

另外你在什么地方进行登录和退出操作的?不是在init和end部分吧?

i_sea 发表于 2007-8-23 14:27:48

所有的脚本都在Action里面,创建socket也在里面,发送登录和退出的数据包也在里面,最后面我想加上关闭socket的代码就出错,

大家遇到过类似的问题么?有没有遇到过socket不能关闭的情况?

i_sea 发表于 2007-8-23 15:36:34

又要沉了

很多疑问都是无声无息的沉下去了

我们不解决问题就没办法真正学到知识

不要碰到问题绕过去

我不能让这个帖子沉了!

i_sea 发表于 2007-10-11 10:17:44

up

higkoo 发表于 2008-10-16 08:57:42

我也遇到了:

Action.c(3): Error: An exception was raised while calling invocation function in interpreter extension cciext.dll: System Exceptions: Uknown.

clxymn 发表于 2008-10-16 10:22:14

期待问题的解决···帮楼主顶一下!不要沉了:lol

hongfu183 发表于 2008-10-30 09:47:45

你用进程而不是线程来运行脚本试下吧

songlilimnky 发表于 2008-11-1 15:08:48

顶一下
页: [1]
查看完整版本: Socket不能关闭