如何使用udp从c#客户端与c服务器通信?
我的问题描述如下: 我的如何使用udp从c#客户端与c服务器通信?,c#,c,sockets,udp,client-server,C#,C,Sockets,Udp,Client Server,我的问题描述如下: 我的C#客户端使用sendto发送udp数据包。因为这是C 35;,所以这是我构建的字节数组 C服务器使用recvfrom接收数据包。通过wireshark,我已经确认C#程序正在发送数据包,并且C程序正在接收数据包。recvfrom没有抛出任何类型的错误。但我无法从收到的数据包中提取任何数据。我以字符数组的形式接收它 具体细节: 我发送的UDP数据包是一个请求。c程序和c#程序都知道请求的结构。但是,由于我正在通过线路发送一个字节数组,所以这个结构是不相关的(我认为) 代码
C#
客户端使用sendto
发送udp数据包。因为这是C 35;
,所以这是我构建的字节数组
C
服务器使用recvfrom
接收数据包。通过wireshark,我已经确认C#
程序正在发送数据包,并且C
程序正在接收数据包。recvfrom
没有抛出任何类型的错误。但我无法从收到的数据包中提取任何数据。我以字符数组的形式接收它
具体细节:
我发送的UDP
数据包是一个请求。c
程序和c#
程序都知道请求的结构。但是,由于我正在通过线路发送一个字节数组,所以这个结构是不相关的(我认为)
代码:
C#
:
构建数据包:
``
。。。
``
我确信我在这整件事中遗漏了一个基本方面。请帮我找出是什么。任何帮助都将不胜感激
谢谢。
< P>一旦这些位已经写入了该线,它就不是C、C++、C、java、FORTRAN、COBOL、LISP、Strand、Scala或其他任何东西。这是电线上的零头。这是你缺少的基本方面。电线上的数据没有结构 一旦您读取了数据,就由您来获取这个字节集合并对其应用一个结构。这意味着您需要知道前四个字节表示一个数字,低阶字节存储在有效负载开始处的offest 0处,下一个高阶字节位于偏移量1处,下一个高阶字节位于偏移量2处,最高阶字节位于偏移量3处。您的具体示例可能与上面的描述没有任何共同之处,但是如何将数据打包成字节并从字节中解包是您需要注意的问题验证是否在最低级别写入所有字节。保留一个映射,映射哪些数据在哪些字节中,然后独立于刚才编写的规范编写通信的每一方。不要试图在不将整型数/短型数/数据结构转换为字节的情况下将整型数/短型数/数据结构写入数据包;否则,您会发现两端的机器可能对整数/短字符/数据结构的表示方式有不同的看法。您好,您所说的完全有道理。但我已经验证了我想要发送的内容正在发送,并且接收的内容与发送的内容完全相同。这是因为我逐字节写入缓冲区。不过,我最初的问题仍然存在。我如何在服务器端接收它?在字符数组中接收它是否有问题?如前所述,wireshark确认数据包被正确发送。在服务器端,您应该接受字节数组。根据语言的不同,字符数组可能是相同的(如在C中),但在其他语言中,字符是多字节的。如果您在多字节字符环境中接收数据,您会发现这些字节是在没有显式控制的情况下打包的(因此可能会出错)。确保将负载视为字节数组,然后显式地编写从字节到其他项的映射。
byte[] tmpB;
int j = 0;
char[] reqStr = rsField.reqStr;
for (; j < reqStr.Length; j++)
{
tmpB = BitConverter.GetBytes((char)reqStr[j]);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
}//end of for
tmpB = BitConverter.GetBytes((UInt32)rsField.fieldLength);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
tmpB = BitConverter.GetBytes((UInt32)rsField.fieldType);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
//------------------------------------------------------------
tmpB = BitConverter.GetBytes((UInt32)ctField.camType);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
tmpB = BitConverter.GetBytes((UInt32)ctField.fieldLength);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
tmpB = BitConverter.GetBytes((UInt32)ctField.fieldType);
for (int ctr = 0; ctr < tmpB.Length; ctr++)
retVal[i++] = tmpB[ctr];
char buf[1000];
memset(&buf,'\0',sizeof(buf));
length = recvfrom (i, &buf, sizeof(buf), 0,
(struct sockaddr *)&remoteAddr, &fromLen);
now = time(0);
if (length == -1) {
fprintf (stderr, "%s: recvfrom error - %m\n", ctime(&now));
continue;
}
unsigned long fieldType1 = strtoul(bufPtr,0,10);
bufPtr += 4 * sizeof(char);
unsigned long fieldLength1 = strtoul(bufPtr,0,10);
bufPtr += 4 * sizeof(char);
unsigned long res = strtoul(bufPtr,0,10);
printf("fieldType: %ld \t fieldLength: %ld \t res: %ld \t \n",fieldType1,fieldLength1,res);