能否使用一个TCP连接发送两次数据,该如何处理

能否使用一个TCP连接发送两次数据
我建立一个TCP连接,先使用send发送一个初始化的命令,然后再使用一个send发送数据包的命令,另外一端使用一个recv来接收数据,调试的时候却总是出问题,不知道这样是否行得通?

------解决方案--------------------
行得通,不过tcp是流,没有包的概念。你接收时可能接收两个包,也可能半个包,要自己组包
------解决方案--------------------
应用层开缓冲区,顺序读,包完整就取走。
------解决方案--------------------
我想实现的是待第一个send发送完之后再发第二个send

发送第一个命令后,服务器接到再发一个回复包,客户端接到回复包再发第二个。

或者

每个包有固定大小,接受端根据接受的数据大小判断是一个包还是两个包

或者

为每个包加入包头,包头里包含协议号,版本号,包的大小等
------解决方案--------------------
首先你那样肯定是可以的.编码细节而已.

再则.必须订立一个协议, 双方把 每个包的包长度订立下来.否则不好弄.因为 接收消息的时候是无规则的,有时候某个时刻可能会只接收了 半个包. 如果你不定义整个包长的话 你的数据就会出问题.

在socket编程下 每个包的长度还需要你控制,无法做到那么智能: 你觉得发一个包 对方就收1个包

真正的情况是:你发了1个包,对方可能好几次才把包接收完. 这个时候你如果只 recev1次的话 那接收到的数据肯定是乱七八糟的.
------解决方案--------------------
TCP传输的是数据流,没有数据包的概念。你发送一次,可能接收N次才收完,你发送N次也可能一次就收完。
------解决方案--------------------
那如何保证第一个send发送完之后再发送第二个send呢?
------------------------------

这个不归发送方控制.
如果非要控制的话 那是比较不可理喻的事情.虽然也能实现.

从接收方控制:

比如发送方每个包10个字节. 发送2个包之后就什么都不干了.

那么接收方只需要写 resv 10个字节封装成1个包 再resv10个字节封装成另外一个包.
这样,你所发送的数据就不会乱了.

比如 byte,byte,byte,byte,int,short 第1个包
int,byte,short,byte,byte,byte 第2个包
如果你是按长度来读,那就肯定不会出现包混乱的情况.

当然,很多情况下根据业务逻辑的不同,各包都是变长的,这样,就会在包头附带4个字节的Int或者2个字节的short来规定后来还有多少字节需要读取.


打这么多字真累.....