【发布时间】:2011-08-02 17:30:19
【问题描述】:
我的问题描述如下:
我的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 sockets udp client-server