Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 通过套接字c+对AT命令的错误响应+/cli_Visual Studio_C++ Cli_Telnet_At Command - Fatal编程技术网

Visual studio 通过套接字c+对AT命令的错误响应+/cli

Visual studio 通过套接字c+对AT命令的错误响应+/cli,visual-studio,c++-cli,telnet,at-command,Visual Studio,C++ Cli,Telnet,At Command,我想创建一个简单的套接字,通过AT命令与另一个设备通信 我在Visual 2017上使用C++/CLI 这是我的密码 #include "stdafx.h" #include <conio.h> using namespace System; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::IO; int main(array<System:

我想创建一个简单的套接字,通过AT命令与另一个设备通信

我在Visual 2017上使用C++/CLI

这是我的密码

#include "stdafx.h"
#include <conio.h>

using namespace System;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::IO;

int main(array<System::String ^> ^args)
{
    int bufferSize = 1024;
    array<Byte>^ sendBuffer = gcnew array<Byte>(bufferSize);
    array<Byte>^ recvBuffer = gcnew array<Byte>(bufferSize);


    try {
        // Establish the remote endpoint for the socket.  
        IPHostEntry^ ipHostInfo = Dns::Resolve("192.168.1.1");
        IPAddress^ ipAddress = ipHostInfo->AddressList[0];
        IPEndPoint^ remoteEP = gcnew IPEndPoint(ipAddress, 1234);

        // Create a TCP/IP  socket.  
        Socket^ socket = gcnew Socket(AddressFamily::InterNetwork,SocketType::Stream, ProtocolType::Tcp);

        // Connect the socket to the remote endpoint. Catch any errors.  
        try {
            socket->Connect(remoteEP);

            // Encode the data string into a byte array.  
            array<Byte>^ msg = Text::Encoding::ASCII->GetBytes("AT");

            // Send the data through the socket.  
            int bytesSent = socket->Send(msg);

            // Receive the response from the remote device.  
            int bytesRec = socket->Receive(recvBuffer);
            Console::WriteLine("Echoed test = {0}", Text::Encoding::ASCII->GetString(recvBuffer, 0, bytesRec));

            // Release the socket.  
            socket->Shutdown(SocketShutdown::Both);
            socket->Close();

        }
        catch (ArgumentNullException^ ane) {
            Console::WriteLine("ArgumentNullException : {0}", ane->ToString());
        }
        catch (SocketException^ se) {
            Console::WriteLine("SocketException : {0}", se->ToString());
        }
        catch (Exception^ e) {
            Console::WriteLine("Unexpected exception : {0}", e->ToString());
        }

    }
    catch (Exception^ e) {
        Console::WriteLine(e->ToString());
    }

    _getch();
    return 0;
}
在ASCII中有一些奇怪的值:255251,3255251,1255254,1255253

答案应该是OK或ERROR


我在192.168.1.1 1234上通过Telnet对它进行了测试,它工作正常。

标准警告:虽然可以用C++/CLI编写应用程序的主体,但不推荐使用。C++/CLI是用于互操作场景的:C++或其他.NET代码需要与非托管C++接口,C++/CLI可以提供两者之间的转换。对于主要的开发,如果需要托管代码,或者建议使用C++,如果需要非托管的,则建议使用C**。
也就是说

与流行的观点相反,telnet协议不是原始TCP套接字。telnet客户端之间有一个用于通信选项的协议

您看到的是从服务器发送的telnet命令。这些将由您的telnet客户端接收,并用于修改其行为方式。这就是为什么在使用真正的telnet客户端时,一切都能正常工作的原因:它使用这些字节并正确地解释命令

我阅读了几分钟Telnet规范,以下是我能够从您发布的数据中解码的内容:

  • 255:IAC,“解释为命令”。这是所有Telnet命令的转义字符
  • 251:WILL:表示服务器想要/正在执行一个选项
  • 3:禁止前进:显然Telnet在默认情况下是半双工协议,“前进”是一方告诉另一方“好的,轮到你了”的标志。此选项将其转换为全双工连接
  • 255:IAC
  • 251:威尔
  • 1:ECHO:表示服务器将回显接收到的字符
  • 255:IAC
  • 254:不要:表示服务器正在请求客户端不要执行某些操作
  • 1:ECHO:表示服务器希望客户端不回显接收到的字符
  • 255:IAC
  • 253:DO:表示服务器希望客户端打开某些选项
好的,现在我们知道发生了什么,我们如何解决这个问题?我看到一些选择:

  • 你说你想用“AT命令”和设备通话。AT命令是您用来与调制解调器通话的命令。我假设您有一些串行设备,可能是一个调制解调器,您已经连接到一个小型转换器设备,该设备将串行端口公开为TCP连接。如果是这样,那么转换器设备可能有一些选项来禁用Telnet协议,并将其公开为“原始”或类似的内容。如果这是真的,那么这可能是最好的选择
  • 您可以向程序中添加代码以查找
    IAC
    字节,并处理其后的字节。如果只是连接开始时的几个命令,那么您就可以期待这些固定字节;如果命令是在连接过程中发送的,则需要在任何地方处理它们。这取决于你有多想处理它们。(例如,如果服务器说不禁止前进,您是否会发送前进命令?理想情况下,您会这样做,但如果您的特定连接从未这样说,则可能不会。)
  • 可能有一个telnet库可以为您处理协议内容。我没有找过这个
Telnet参考资料:

  • 主RFC,其中定义了IAC字节和命令字节:
  • 回显选项:
  • 抑制前进选项:
  • 非官方参考,但列出了可通过WILL、WILL-Not、DO和DO指定的选项,以及它们在以下文件中定义的RFC:

标准警告:虽然可以用C++/CLI编写应用程序的主体,但不建议这样做。C++/CLI是用于互操作场景的:C++或其他.NET代码需要与非托管C++接口,C++/CLI可以提供两者之间的转换。对于主要的开发,如果需要托管代码,或者建议使用C++,如果需要非托管的,则建议使用C**。
也就是说

与流行的观点相反,telnet协议不是原始TCP套接字。telnet客户端之间有一个用于通信选项的协议

您看到的是从服务器发送的telnet命令。这些将由您的telnet客户端接收,并用于修改其行为方式。这就是为什么在使用真正的telnet客户端时,一切都能正常工作的原因:它使用这些字节并正确地解释命令

我阅读了几分钟Telnet规范,以下是我能够从您发布的数据中解码的内容:

  • 255:IAC,“解释为命令”。这是所有Telnet命令的转义字符
  • 251:WILL:表示服务器想要/正在执行一个选项
  • 3:禁止前进:显然Telnet在默认情况下是半双工协议,“前进”是一方告诉另一方“好的,轮到你了”的标志。此选项将其转换为全双工连接
  • 255:IAC
  • 251:威尔
  • 1:ECHO:表示服务器将回显接收到的字符
  • 255:IAC
  • 254:不要:表示服务器正在请求客户端不要执行某些操作
  • 1:ECHO:表示服务器希望客户端不回显接收到的字符
  • 255:IAC
  • 253:DO:表示服务器希望客户端打开某些选项
好的,现在我们知道发生了什么,我们如何解决这个问题?我看到一些选择:

  • 你说你想用“AT命令”和设备通话。AT命令是您用来与调制解调器通话的命令。我假设您有一些串行设备,可能是一个调制解调器,您连接到一个小型转换器设备,该设备将串行端口公开为TCP co
    Echoed test = ????????