解决 套接字编程

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
你好
我目前正在使用套接字编程将命令发送到设备,然后它发送回复命令。
如何获得控制台以读取返回的回复?

到目前为止,我有

C#:
 m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(DatalogicIP);
                System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, DatalogicPort);
                m_socClient.Connect(remoteEndPoint);
                Console.WriteLine("Connection Successful");
                Console.ReadLine();

能够成功连接,然后即时发送

C#:
string hostMode = "<ESC>[C";
C#:
 byte[] byData = System.Text.Encoding.ASCII.GetBytes(hostMode);
                m_socClient.Send(byData);

我应该收到<ESC> H <CR><LF>返回,但我如何让控制台进行聆听并显示回复
一旦我拿回了H,我希望以后可以发送另一个命令

感谢任何帮助(是套接字的新手)

谢谢
汤姆
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
啊,
您能帮我弄清楚如何从设备读取代码吗?如果他们发送<ESC> H <CR><LF>我可以在console.writeline上显示它。这样,我知道那是我收到的,然后我可以发送第二个,依此类推。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
请参阅Microsoft的同步客户端/服务器示例代码。
 

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
我能够连接并发送初始命令,尝试通过大力神发回,但未显示在控制台编写行中。有任何想法吗?。响应未写入控制台。只是发送"Test" back.
C#:
 try
                {
                    // Establish the remote endpoint for the socket. 
                    // The name of the   
                    // remote device is "host.contoso.com". 
                    IPHostEntry ipHostInfo = Dns.GetHostEntry("192.168.4.15");
                    IPAddress ipAddress = ipHostInfo.AddressList[0];
                    IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

                    // Create a TCP/IP socket. 
                    Socket client = new Socket(ipAddress.AddressFamily,
                        SocketType.Stream, ProtocolType.Tcp);

                    // Connect to the remote endpoint. 
                    client.BeginConnect(remoteEP,
                        new AsyncCallback(ConnectCallback), client);
                    connectDone.WaitOne();

                    // Send test data to the remote device. 
                    Send(client, "Hello World<EOF>");
                    sendDone.WaitOne();

                    // 接收 the response from the remote device. 
                    接收(client);
                    receiveDone.WaitOne();

                    // Write the response to the console. 
                    Console.WriteLine("Response received : {0}", response);

                    // Release the socket. 
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();

                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
 

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
如果我发送控制台发送一个<CR><LF>我需要做为ASCII十六进制字符吗?还是可以使用<CR><LF> in the string???

干杯
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
您需要发送这些ASCII码点的二进制值。这些二进制值在代码中的表示方式有所不同。在C#中,编译器将采用:"\r\n"并将它们转换为正确的二进制值。
 

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
Awesome, - I added in the \ r \ n and it's done it. For my reply i am expecting a <ESC>H<CR><LF>如何将其添加到我的if语句中?
我试图与byresRec对抗,但我知道有些错误。对不起,我是套接字的新手...


C#:
 try
                {
                    sender.Connect(remoteEndPoint);

                    Console.WriteLine("SVS Connected To Datalogic {0}",
                        sender.RemoteEndPoint.ToString());
                    Console.ReadLine();
                    // Encode the data string into a byte array. 
                    byte[] msg = Encoding.ASCII.GetBytes("Message Sent 测试 \ r \ n");
                    // Send the data through the socket. 
                    int bytesSent = sender.Send(msg);



                    // 接收 the response from the remote device. 
                    int bytesRec = sender.Receive(bytes);
                    Console.WriteLine("{0}",
                        Encoding.ASCII.GetString(bytes, 0, bytesRec));
                    
                  
                    Console.ReadLine();
                    if (bytesRec = "   \ r \ n")
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您看起来并不难...为什么需要此功能?

试试(\033)
 

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
谢谢。是其他程序(外部软件)将其包含在Reply命令中。我需要阅读响应,然后根据是否收到回复发送第二条命令。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
那你是一个快乐的露营者吗?

对您有用吗?
 

tdignan87

知名会员
已加入
2019年7月8日
留言内容
95
编程经验
Beginner
嗨道林斯,
是的,确实如此-您知道验证回复的最佳方法是什么
如果我的答复是示例<ESC>H<CR><LF> then ..

C#:
 // 接收 the response from the remote device. 
                    int bytesRec = sender.Receive(bytes);
                    Console.WriteLine("{0}",
                        Encoding.ASCII.GetString(bytes, 0, bytesRec));

这将返回字节OK,但是如果我可以验证是否收到该响应以及在说10秒钟后没有响应,那将是一个很好的选择。您对此有何最佳见解?干杯-希望您周末愉快。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
It usually pays to read the documentation for the classes that you use. For example, just scanning the Socket class documentation, it shows that it has a 接收超时 属性描述为:
获取或设置一个值,该值指定同步后的时间长度 接收 通话会超时。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您知道什么是验证回复的最佳方法
正则表达式。

或为您要检查的字符编写一个十六进制类。

服务器发回什么?是路径,地址还是其他?
 
最佳 底部