簡體   English   中英

如何使用udp從c#客戶端與c服務器通信?

[英]how to communicate with c server from c# client using udp?

我的問題描述如下:

我的C#客戶端使用sendto發送udp數據包。 因為這是C# ,所以這是我構造的字節數組。

C服務器使用recvfrom接收數據包。 通過wireshark,我已經確認C#程序正在發送數據包,並且C程序正在接收它。 recvfrom不會拋出任何錯誤。 但我無法從收到的數據包中提取任何數據。 我在char數組中收到它。

具體細節:我發送的UDP數據包是一個請求。 c程序和C#程序都知道請求的結構。 但由於我通過線路發送一個字節數組,這個結構是無關緊要的(我認為)。

代碼: 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];

...``你可以看到,我有一個字符串和數字字段的混合。 (這些不是我擁有的唯一字段,代碼因可讀性而縮短)

C :``

            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);

......“我確信我在這件事中缺少一個基本方面。 請幫我看看它是什么。 任何幫助,將不勝感激。

謝謝。

一旦將這些位寫入線路,它就不是C,C ++,C#,Java,FORTRAN,COBOL,lisp,scheme,scala或其他任何東西。 它是電線上的位。 這是你缺少的基本方面。 電線上的數據沒有結構。

一旦讀取了數據,就可以使用這個字節集合並對其應用結構。 這意味着你需要知道前四個字節代表一個數字,低階字節存儲在有效載荷開始的第0個字節,下一個高字節是偏移1,下一個高字節是偏移2,最高位字節位於偏移量3.您的具體示例可能與上面的描述沒有任何共同之處,但是如何打包成字節並解壓縮字節的想法是您需要特別注意的。

驗證在最低級別,您正在寫入所有字節。 保留哪些數據以哪些字節為單位的映射,然后獨立於您剛編寫的規范寫入通信的每一側。 不要試圖將整個整數/短路/數據結構寫入數據包而不將其轉換為字節; 否則,你會發現兩端的機器對整數/短路/數據結構的表示方式可能有不同的看法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM