如何使用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);