donet的Socket通信问题

monking007 2005-03-09 10:39:57
我现在做一个项目,用donet写一端通信程序,而另一端则是用vc写的程序
vc那一端的代码形式如下:
void StartBilling()
{
char szPacket[256];
int nPacketNum = 6;
int nSize = 0;

memset( &szPacket, 0, 256 );
memcpy( &szPacket[0], &nPacketNum, sizeof( int ) );
nSize += sizeof( int );
memcpy( &szPacket[nSize], &g_ServerNum, sizeof( int ) );
nSize += sizeof( int );

send( g_BillSocket, szPacket, nSize, 0 );
}
而我以前在dotnet写的程序,
int intByteCount =clientSocket.Receive(bytReceive);
strDataReceive= Encoding.UTF8.GetString(bytReceive,0,intByteCount);
可是这样并不能解析出那边发过来的信息字段

应该如何解析出里面的字段信息:而发送的信息也和那边的信息类似的格式呢?

小弟这个问题非常棘手,请高手指教拉
...全文
272 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steven_luo 2005-03-18
  • 打赏
  • 举报
回复
我发现一个严重的错误哈
int intByteCount =clientSocket.Receive(bytReceive);
strDataReceive= Encoding.UTF8.GetString(bytReceive,0,intByteCount);
怎么可以这样,应该循环读才对啊,不能转换成GetString,不过我想看看你其他部分的Socket的实现方法,我想用的是异步的Socket
Steven_luo 2005-03-18
  • 打赏
  • 举报
回复
有趣了,我做的也是客户端VC,服务器端C#,猴子海风加我QQ
24456406
Msn : photon_jc@hotmail.com
多多交流
windyxiaoxiao 2005-03-11
  • 打赏
  • 举报
回复
关注,留名
monking007 2005-03-10
  • 打赏
  • 举报
回复
up
monking007 2005-03-10
  • 打赏
  • 举报
回复
我最后发的才是他们的源代码
正因为我的解读是错的,所以我想请教一下大家
x1_x11 2005-03-09
  • 打赏
  • 举报
回复
VC用的是单字节的字符,你用的是双字节的,看看问题是不是出在这里.
diaoerlangdang 2005-03-09
  • 打赏
  • 举报
回复
up
xjpeng 2005-03-09
  • 打赏
  • 举报
回复
一次通信中读取128位?然后依次读sizeof( int )长度的PackerNumber,再读50位的UID...但我看最终发送的nSize又没有128位,每次通信到底读取多少位才算一次通信完成?然后其余的算下一次通信?还是连接一次只发一次数据?

int intByteCount =clientSocket.Receive(bytReceive);
strDataReceive= Encoding.UTF8.GetString(bytReceive,0,intByteCount);
这样肯定是乱码,c端怎么发的,s端也得进行相应的解读。
monking007 2005-03-09
  • 打赏
  • 举报
回复
他定义的规则,就是用上面的VC方式传输
har szPacket[128];
memset( &szPacket, 0, 128 );
int nSize = 0;

memcpy( &szPacket, &nPacketNumber, sizeof( int ) );
nSize += sizeof( int );
memcpy( &szPacket[nSize], &szUID, strlen( szUID ) );
nSize += 50;
memcpy( &szPacket[nSize], &szMac, strlen( szMac ) );
nSize += 32;
memcpy( &szPacket[nSize], &szIP, strlen( szIP ) );
nSize += 20;
memcpy( &szPacket[nSize], &nServerNumber, sizeof( int ) );
nSize += sizeof( int );
memcpy( &szPacket[nSize], &nState, sizeof( int ) );
nSize += sizeof( int );
memcpy( &szPacket[nSize], &nValue, sizeof( int ) );

send( nSock, szPacket, nSize, 0 );

所有 Packet 使用 上述Packet 构造. 不使用的值初始化成0.

这个是一个韩国人写的通信程序,他发给我,叫我按照他的方式去做
xjpeng 2005-03-09
  • 打赏
  • 举报
回复
另外我觉得使用BinaryReader会方便一些,它提供多种Read方法
NetworkStream stream = null;
stream = new NetworkStream(clientSocket);
BinaryReader reader = new BinaryReader(stream);


xjpeng 2005-03-09
  • 打赏
  • 举报
回复
我这边是通过流操作的,但我看你现在的问题是不知道如何解析得到的bytes。我想你是缺少一套通信命令机制,所以无法解析。你可以先定义出一套通信命令,比如
连接号(8位)+命令类型{4位}+信息长度{8位}+信息
注:位数我随便定的,你可自己再加考虑,连接号是用来区分多个客户端,命令类型用来处理不同的信息和响应等等。
两边都遵循规则,这样一旦建立连接后,可以连续不断的进行通信。数据也不会混淆。
xjpeng 2005-03-09
  • 打赏
  • 举报
回复
我找找
cpio 2005-03-09
  • 打赏
  • 举报
回复
网络上传输的东西和用什么语言有什么关系呢?
JasonHeung 2005-03-09
  • 打赏
  • 举报
回复
用Encoding.Default
monking007 2005-03-09
  • 打赏
  • 举报
回复
那“海风”可不可以提供一下经验阿
谢谢
gjmax 2005-03-09
  • 打赏
  • 举报
回复
我用VC写过也用DONET写过,不过都是VC跟VC(直接用CHAR),DONET跟DONET(用BYTE流)
你这样的倒是没见过,帮你顶一下~
关注
jackie615 2005-03-09
  • 打赏
  • 举报
回复
up
xjpeng 2005-03-09
  • 打赏
  • 举报
回复
怎么跟我以前做的一个程序一样,客户端是vc的,服务器端是c#
monking007 2005-03-09
  • 打赏
  • 举报
回复
Byte也是单字节啊,接收到的信息是正确的,我调试时候对比了,是正确的
但是不知道怎么把这些有效的信息给解析出来

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧