C++ 如何在双向套接字连接上序列化类似telnet的通信?

C++ 如何在双向套接字连接上序列化类似telnet的通信?,c++,multithreading,sockets,vb6,telnet,C++,Multithreading,Sockets,Vb6,Telnet,我已经实现了在同一台机器上运行的VB和VC++程序之间的TCP/IP通信。在VC++端,我生成了一个线程,用于侦听连接。在VB端,我使用Winsock API连接到C++服务器。一切似乎都很好,特别是当我手动调试并逐步完成通信时。协议基于文本,命令终止于“\n”,可能有答案,也可能没有答案 这就是问题所在。我试图实现发送到服务器的命令,这需要一些处理,服务器将它们发送回客户端。在简单的条件下,这可以正常工作,但在重载或不同的机器配置下,有时通信会中断 客户端可能正在发送命令,但服务器可能正在发送

我已经实现了在同一台机器上运行的VB和VC++程序之间的TCP/IP通信。在VC++端,我生成了一个线程,用于侦听连接。在VB端,我使用Winsock API连接到C++服务器。一切似乎都很好,特别是当我手动调试并逐步完成通信时。协议基于文本,命令终止于“\n”,可能有答案,也可能没有答案

这就是问题所在。我试图实现发送到服务器的命令,这需要一些处理,服务器将它们发送回客户端。在简单的条件下,这可以正常工作,但在重载或不同的机器配置下,有时通信会中断

客户端可能正在发送命令,但服务器可能正在发送前一个命令的应答。VB客户端不知何故得到了一个支离破碎的答案(比如说,它得到的不是“接收到的数据”,而是“接收到的”),这破坏了我为跟踪连接而实现的状态机


所以,是的,客户端和服务器同时在说话,这造成了一个问题。如何将此通信序列化或排队?我知道这类似于以太网上的网络数据包冲突问题。

我的猜测不是数据包冲突,而是您从套接字读取的数据超出了预期。您最后一次从套接字读取的数据是否类似于

OTHER STUFF\nDATA REC

在下一次读取时,您会得到“EIVED”?

而不是数据包冲突,我的猜测是您从套接字读取的数据比预期的要多。您最后一次从套接字读取的数据是否类似于

OTHER STUFF\nDATA REC

在下一次阅读时,您会得到“EIVED”?

TCP已经被序列化了-您的代码中有一个bug。通常,这个bug存在于您的代码中。不是编译器、操作系统或标准模板库。是的,如果我的代码中没有bug,我就不会在我几乎不理解的问题上寻求帮助。我可以做些什么来找出这个bug的位置,有什么建议吗?服务器端?客户端?有没有办法确保至少有一个端点做得对?可能是记录/监控通信的代理?除了printfs,还有什么工具可以调试它呢?我会重新标记这个,不使用多线程、telnet或sockets,并添加TCP以更好地关注它。TCP已经序列化了-您的代码中有一个bug。通常情况下,这个bug存在于您的代码中。不是编译器、操作系统或标准模板库。是的,如果我的代码中没有bug,我就不会在我几乎不理解的问题上寻求帮助。我可以做些什么来找出这个bug的位置,有什么建议吗?服务器端?客户端?有没有办法确保至少有一个端点做得对?可能是记录/监控通信的代理?除了printfs,还有什么工具可以调试它呢?我会用多线程、telnet或sockets重新标记它,并添加TCP以更好地集中它。可能是。VB非常基本,所以它只在GUI上显示最后收到的消息。我必须将所有内容都记录到一个文件中,看看问题是否在于两个答案排队并在同一个套接字读取中传递。从其他答案来看,TCP是序列化的,因此这似乎是唯一可能的解释。是否有一个与fflush()等效的TCP协议可以帮助我解决这个问题?TCP是一种流协议。想象一下,正在读取另一个进程附加到其末尾的文件。您只能从当前正在转发的位置读取,并且只能读取到目前为止已提交到磁盘的内容。除了两个程序之间定义的消息之外,没有“消息”,因此您需要根据一些共同约定(EOR字符、长度前缀等)将流解块为消息。每次在DataArrival后调用.GetData只能保证返回一个字节的数据,但很可能返回1、3或17.5个“消息”。查看代码,在阅读了您的答案和指南后,我现在可以看出问题出在VB客户端,它不希望消息被截断,也不会在接收后\n保留数据。可能是这样。VB非常基本,所以它只在GUI上显示最后收到的消息。我必须将所有内容都记录到一个文件中,看看问题是否在于两个答案排队并在同一个套接字读取中传递。从其他答案来看,TCP是序列化的,因此这似乎是唯一可能的解释。是否有一个与fflush()等效的TCP协议可以帮助我解决这个问题?TCP是一种流协议。想象一下,正在读取另一个进程附加到其末尾的文件。您只能从当前正在转发的位置读取,并且只能读取到目前为止已提交到磁盘的内容。除了两个程序之间定义的消息之外,没有“消息”,因此您需要根据一些共同约定(EOR字符、长度前缀等)将流解块为消息。每次在DataArrival后调用.GetData只能保证返回一个字节的数据,但很可能返回1、3或17.5个“消息”。查看代码,在阅读了您的答案和指南后,我现在可以看出问题出在VB客户端,它不希望消息被截断,也不希望在接收后\n保留数据。