socket通信收到的数据与发出的不相符。

KeepCoding 2004-11-12 02:38:46
tcp/ip socket通信。

typedef struct _tag_MyPack
{
DWORD len;
char *pdata;
}

发送方先发len,四个字节,再发pdata指向的数据。

接收方先读入四个字节,然后转换为DWORD,再根据这个长度读入其后的数据。

通信开始是正确的,但是一段时间后会出错,我用sniffer工具查看了,出错是因为接收的数据与发送的数据根本不相符。
发送时的数据:00CC000400030001
接收得到数据:A600B7C600BFD600

我觉得很奇怪,接收方和发送方都是windows2000操作系统,究竟是怎么回事呢?

多谢多谢!
...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepCoding 2004-11-12
  • 打赏
  • 举报
回复
多谢各位,问题已经解决,犯了低级错误,sigh

多谢多谢大家!
ayanamiwww 2004-11-12
  • 打赏
  • 举报
回复
在确定你定义好数据结构以1字节对齐,看下面

这个情况可能出现在你连续大量的收发数据的时候,我想

tcp在收发数据的时候,可能一次发送多个数据包,所以在收包的时候要判断,是否收完所有数据,不然,丢了一些数据,那么下面的数据自然是不对。
ayanamiwww 2004-11-12
  • 打赏
  • 举报
回复
在确定你定义好数据结构以1字节对齐,看下面

这个情况可能出现在你连续大量的收发数据的时候,我想

tcp在收发数据的时候,可能一次发送多个数据包,所以在收包的时候要判断,是否收完所有数据,不然,丢了一些数据,那么下面的数据自然是不对。
qinzui 2004-11-12
  • 打赏
  • 举报
回复
首先,你这个结构体定义得有问题
typedef struct _tag_MyPack
{
DWORD len;
char *pdata;
}
应该定义成:
typedef struct _tag_MyPack
{
DWORD len;
char pdata[1];
// 后面是data...
}
分配好空间,然后将你要发送的数据拷入pdata这个数组便可。
angelcool 2004-11-12
  • 打赏
  • 举报
回复
贴写代码看看
KeepCoding 2004-11-12
  • 打赏
  • 举报
回复
up
一个面向局域网、互联网的即时聊天工具,它专门针对学校及企业内部的网络通讯而开发的。 Messenger除了具有一般聊天工具都有的基础功能以外,还有自定义表情符等高级功能,使用简单,服务器无需特别数据库配置。 本软件很适合作为学校、企业内部局域网的通讯工具。 用户登录基本原理 1.用户登录,客户端根据用户填写的IP向服务器发送连接请求,若IP正确且服务器工作正常。服务器会在Winsock数组(Servicesocket(i))中建立一个连接,同时在自定义类型数组UserInfo(u)中初始化一个索引值与该用户使用的Servicesocket索引(Index属性)值相同的元素,并将其所有值设置为N/A(执行LogIn函数)。然后,服务器调用 New_User 、Login_user 判断用户提交资料与服务器存储的用户资料是否相符(密码是否正确、是否新用户、服务器状况是否允许用户登录等)。若条件符合,服务器向客户端发送登录成功信号(.LoginGood Svc2)并将用户资料写进属于该用户的UserInfo类中。否则向客户端发送登录失败信号(.LoginBad [失败原因代号]),断开连接。 2.用户收到服务器的登录成功信号后,向服务器提交获取好友列表请求(.getbuddys)。服务器收到该请求后调用 GetBuddysFromDB 、Get_User_buddies 完成对该用户好友的数据搜索,并将该用户的所有好友的名称、状态合并为一条命令发送给指定的用户。客户端接收到命令后立刻进行解析,完成对好友的添加及状态更新(利用Wordfunc 模块中的函数)。 3.一个用户登录成功后,服务器会向所有连接在其上的用户(无论该用户处于何种状态)发送一个用户上线状态通知。其它用户接受该通知后根据情况自动决定是否进行更新。 发送/接收信息基本原理 1.当用户点击“发送”按钮或通过其他方式命令客户端发送信息时,客户端将Richtextbox 中的信息代码(TextRTF属性)的开头附加上起始标志(.msg )、在其末尾添加接收用户的名称和结束标志( ||),然后向服务器发送该信息。 2.服务器接收到客户端发出的消息后,根据信息头标志(.msg)判断这是一则聊天信息,同时根据信息结束标志( ||)判断该信息是否完整(若不完整,写入缓冲字符串数组)、获取信息的接收用户。判断完毕后,找到对应用户使用的Servicesocket,向该用户发送信息(若该用户不在线,信息将写入临时文件储存,待该用户上线再发送) ZX Messenger 除文件传送和二人模式外,所有通讯均采用这种模式。 3.信息被转发到目标用户后,将再一次进行完整性判断(因为Winsock发送数据包大小受网络情况限制)并对数据进行连接。然后,使用 Word 函数取出有效信息并显示。 Messenger 使用 Microsoft Visual Basic 6.0 开发,(除去各附件)本软件大体分为两个部分——客户端和服务器端(是典型的C/S架构)。其客户端和服务器端依靠Winsock进行通讯(使用TCP/IP 协议),服务器通过建立Winsock控件数组实现多客户端同时连接的支持。Messenger 的消息走向主要采用 客户端发送——服务器中转——客户端接收的模式(个别功能例外)。 ZX Messenger 适用于 Windows 95/98[注]/Me/2000/XP/.Net Server 2003 [注]:本软件只适用于安装了Microsoft Office或其他带有 Microsoft Visual Basic 6.0 运行库 的 Windows 95/98操作系统,对于没有安装 Microsoft Visual Basic 6.0 运行库的WINDOWS 95/98 ,本软件会无法运行,对于这种情况,请下载 Microsoft Visual Basic 6.0 运行库 并安装。Win98 以后的操作系统不存在此问题。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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