C# System.Net.Sockets发送vs stdcall:send 我写了两个程序,一个是C语言,一个是C++程序,通过套接字连接发送数据。p> 两个程序都运行,都返回相同的期望值:代码> iRESult/Cuth>,但只有C++程序控制我正在与之通信的设备。< /P>
当我在手表的调试模式下查看C# System.Net.Sockets发送vs stdcall:send 我写了两个程序,一个是C语言,一个是C++程序,通过套接字连接发送数据。p> 两个程序都运行,都返回相同的期望值:代码> iRESult/Cuth>,但只有C++程序控制我正在与之通信的设备。< /P>,c#,c++,sockets,char,byte,C#,C++,Sockets,Char,Byte,当我在手表的调试模式下查看SendData的值时,有一些不同之处。例如: SendData[0] = 143 // c# result SendData[0] = -113 ' ' //c++ result 问题:这是byte[]与char[]之间的差异,还是send方法的实现方式不同? c++: c#: 您的套接字类型是C#code的SocketType.Raw,但您似乎没有正确创建TCP数据包。您最终发送的是垃圾,您的设备或任何期望正确TCP数据包的人都无法理解这些垃圾。该senddata
SendData
的值时,有一些不同之处。例如:
SendData[0] = 143 // c# result
SendData[0] = -113 ' ' //c++ result
问题:这是byte[]
与char[]
之间的差异,还是send方法的实现方式不同?
c++:
c#:
您的套接字类型是C#code的
SocketType.Raw
,但您似乎没有正确创建TCP数据包。您最终发送的是垃圾,您的设备或任何期望正确TCP数据包的人都无法理解这些垃圾。该senddata数组中内置了一个标头和校验和。C++实现不使用原始套接字吗?另外,为什么SDENDATA在两个之间不同?@亚历克斯,C++实现使用TCP套接字(<代码> SokkFixs)。它创建一个合适的TCP数据包,然后用用户数据填充它SendData
并没有什么不同。但由于MSVC将char
视为signed char
,并且0x8F
大于125,因此它将此显示为负数。最好使用无符号字符
作为缓冲区。但是底层位表示仍然与C#中的相同,它是无符号的字节
。好的,我将尝试使用sockettype.stream和协议tcp。谢谢,我以为您在发送自己的头和校验和时必须使用raw。@Alex,这取决于头和校验和。如果您正在执行自己的协议头(TCP/UDP/ICMP/etc),则需要原始模式。但是,如果您使用的是套接字接口已经支持的协议,并且您的头和校验和用于您要发送的内容(有效负载),那么您当然不需要原始套接字。
#pragma comment(lib, "Ws2_32.lib")
WSADATA wsaData;
SOCKET MainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
char SendData[1024];
SendData[i] = 0x8f; i = i + 1;
SendData[i] = 0xa5; i = i + 1;
SendData[i] = 0x02; i = i + 1;
//... etc
SendData[i] = 0x60; i = i + 1;
iResult = send(MainSocket, buf, i, 0);
ipEnd = new IPEndPoint(ip, port);
MainSocket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IPv4);
MainSocket.Connect(ipEnd);
byte[] SendData = new byte[1024];
SendData[i] = 0x8f; i = i + 1;
SendData[i] = 0xa5; i = i + 1;
SendData[i] = 0x02; i = i + 1;
//... etc
SendData[i] = 0x60; i = i + 1;
int iResult = MainSocket.Send(SendData, i, SocketFlags.None);