[英]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.