【发布时间】:2017-04-27 08:36:25
【问题描述】:
我是 C# 编程的新手,我正在尝试编写 TCP 客户端,它将通过十六进制代码向服务器发送十六进制代码,从服务器端读取一些元数据。我设法与服务器连接,但无法发送十六进制代码.你能看看我在这里缺少什么吗?
using System;
using System.IO;
using System.Text;
using System.Net.Sockets;
public class clnt
{
public static void Main()
{
try
{
TcpClient tcpclnt = new TcpClient();
Console.WriteLine("Connecting...");
tcpclnt.Connect("192.168.80.128", 557);
// use the ip address as in the server program
Console.WriteLine("Connected!");
Console.WriteLine("Sending Hex Code...");
string str = Console.ReadLine();
Stream stm = tcpclnt.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(str);
var data = new byte[] { 0xCF, 0xC4 };
Console.WriteLine("Transmitting");
stm.Write(ba, 0, ba.Length);
byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
tcpclnt.Close();
}
catch (Exception e)
{
Console.WriteLine("Opps " + e.StackTrace);
}
}
}
//C++ code
int main()
{
client.Initialize("192.168.80.128", 557);
std::this_thread::sleep_for(std::chrono::seconds(2));
std::string xid = U8("NASA_Arnold_AFB_Airshow");
std::vector<std::uint8_t> command = {0xCF, 0xC4};
command.push_back(static_cast<std::uint8_t>(xid.length()));
command.insert(command.end(), xid.begin(), xid.end());
std::cout << command.size() << std::endl;
client.Correspond(command, 10);
std::this_thread::sleep_for(std::chrono::seconds(3));
command.clear();
command = {0xC8, 0xC3};
std::cout << client.Response().size() << std::endl;
std::vector<std::uint8_t> idhandle(client.Response().begin() + 2, client.Response().end());
command.insert(command.end(), idhandle.begin(), idhandle.end());
client.Correspond(command, 3);
std::this_thread::sleep_for(std::chrono::seconds(3));
for(auto element : client.Response())
std::cout << static_cast<int>(element) << std::endl;
std::uint8_t size = client.Response().back();
std::cout << "size of xid:" << static_cast<int>(size) << std::endl;
client.ReadN(size);
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << std::string(client.Response().begin(), client.Response().end()) << std::endl;
command.clear();
command = {0xC8, 0x4A};
command.insert(command.end(), idhandle.begin(), idhandle.end());
std::cout << idhandle.size() << std::endl;
for(auto element : idhandle)
std::cout << static_cast<int>(element) << std::endl;
client.Correspond(command, 97);
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << std::string(client.Response().begin(), client.Response().end()) << std::endl;
std::getchar();
return 0;
}
【问题讨论】:
-
您要发送什么?你的意思是你想发送
0xAB并接收文字"0xAB"还是什么?因为..如果您考虑一下(0 == 0x00 == null和' ' == 32 == 0x20),那么一切都是“十六进制” -
当您说“无法发送十六进制代码”时,您能澄清一下您的意思吗?您是否收到错误消息,如果有,它们是什么?
-
我注意到代码提示输入
string str = Console.ReadLine();,然后获取字节byte[] ba = asen.GetBytes(str);,最后将这些字节发送到流:stm.Write(ba, 0, ba.Length);。您是否在提示符处输入任何内容?如果没有,则不会有任何字节要发送。 -
嗨,实际上我正在尝试将 C++ 代码移植到 C#。让我为问题编写示例 C++ 代码也许这会有所帮助。
标签: c# c++ sockets tcp tcpclient