为什么我的代码使用完全相同的代码以不同的方式运行?

时间:2014-07-24 23:05:49

标签: vb.net visual-studio-2012

我有一个应用程序,我已经开始开发,通过将从服务器接收的所有消息中继到此应用程序来监视来自连接到websocket服务器的所有客户端的websocket消息。

问题

当我运行我的程序时(在Visual Studio中我点击了Start),它可以完美地构建和启动,并且每次都能完成大部分功能。但是,我常常遇到一些不会运行相同的代码。下面是该代码的小片段。

msg = "set name monitor"
SendMessage2(socket, msg, msg.Length)

msg = "set monitor 1"
SendMessage2(socket, msg, msg.Length)
Console.WriteLine("We are after our second SendMessage2 function")

我知道对SendMessage2的两次调用总是被执行,因为visual studio的调试控制台将输出以下内容

We are at the end of the SendMessage2 Sub
We are at the end of the SendMessage2 Sub
We are after our second SendMessage2 function

我也知道它何时正确执行,因为我的websocket服务器将输出两个块中的一个

应用正常运行时的输出

Client 4 connected
New thread created
Connection received. Parsing headers.
Message from socket #4: "set name monitor"
Message from socket #4: "set monitor 1"

应用运行不正确时的输出

Client 4 connected
New thread created
Connection received. Parsing headers.
Message from socket #4: "set name monitor"

注意第二个输出如何丢失来自监视应用程序的第二条消息。

我尝试了什么

  • 使用字符串变量调用函数
  • 使用静态字符串参数调用函数(不使用变量msg)
  • {{1}分别使用这些功能
  • SyncLock在SendMessage2函数内部
  • 重新排序函数(交换字符串以改变行为)

TL; DR

为什么即使我不更改代码,我的程序也会执行两种不同的方式?我在调用SendMessage2 Sub时是否做错了什么?

我完全没有想法。我愿意尝试任何建议来解决这个问题。

所有代码均可在GitHub here

上找到

1 个答案:

答案 0 :(得分:0)

所以我想通了。

实际上并不是VB应用程序搞乱了。也不是我的服务器。调试时我正在查看服务器收到的字节数,我注意到以下内容:

Client 4 connected
New thread created
Connection received. Parsing headers.
bytes read: 25
Message from socket #4: "set name monitor"
bytes read: 22
Message from socket #4: "set monitor 1"

好的,我们有set name monitor的25个字节和set monitor 1

的22个字节
Client 4 connected
New thread created
Connection received. Parsing headers.
bytes read: 47
Message from socket #4: "set name monitor"

繁荣。两个程序都在完成工作,每次都发送正确的字节数并读取正确的数字。但是,VB应用程序正在快速地发送它们,我的服务器一次读取所有47个字节而不是单独的25和22个字节。

<强>解决方案

我通过在我的服务器中实现一个辅助缓冲区来解决这个问题,以便在第一条消息应该按照组的多个消息之后存储所有字节。现在我在读入新字节之前检查我的secondaryBuffer是否为空。

以下是用于解决问题的代码的一部分

/*Byte Check*/
for (j=0; j < bytes; j++) {
    if (j == 0)
        continue;
    if (readBuffer[j] == '\x81' && readBuffer[j-1] == '\x00' && readBuffer[j-2] == '\x00') {
        secondaryBytes = bytes - j;
        printf("Potential second message attached to this message\nCopying it to the secondary buffer.\n");
        memcpy(secondaryBuffer, readBuffer + j, secondaryBytes);
        break;
    }//END IF
}//END FOR LOOP
/**/