在《分布式网络与帧同步》课程中,任务12,有几个疑问:
1. client → server,数据传输的格式为总长度+协议名长度+协议名+协议体,
但是在server → client时,数据传输的格式为总长度+协议名+协议体,为什么要省略协议名长度?
2. 在编写Send()时,将要发送的数据做成ByteArray类型的对象,压进队列,然后判断队列里的成员数量count == 1,为什么不是count >= 1,如果队列里要是有多个成员(不止一个成员),不应该是多个成员依次进行发送吗?
3. socket.BeginSend(sendBytes , 0 , sendBytes.Length , 0 , SnedCallback , socket); 这句代码中发送的数据直接使用的是sendBytes,而不是从队列中提取出数据,这是为什么?如果直接使用sendBytes,那为什么还要将sendBytes存入队列?
1. 对于传输的格式,client → server 和 server → client 之间存在一些差异是很常见的。在这个情况下,为了简化协议格式,可能认为协议名的长度是固定的,因此在 server → client 的传输中省略了协议名长度。这种设计可以减少传输数据的字节数,提高传输效率。
2. 在编写 Send() 方法时,判断队列里的成员数量是否等于 1,可能是为了确保发送的数据是按顺序发送的,并且每次只发送一个数据包。如果队列里有多个成员,可能会导致并发发送,可能会造成数据包的顺序混乱,或者发送过多的数据包导致网络拥塞。通过只发送队列中的第一个成员,可以确保发送顺序正确,并且控制发送速率,避免网络拥塞。
3. 在 `socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket)` 这句代码中,确实直接使用了 sendBytes 来发送数据,而没有从队列中提取出数据。这可能是因为在发送数据之前,已经将要发送的数据写入了 sendBytes 中,然后直接使用 sendBytes 来发送数据。而将 sendBytes 存入队列可能是为了将待发送的数据包进行排队,以便在 Send() 方法中逐个发送,以确保发送的顺序正确。另外,存入队列也可能是为了异步发送数据时,确保每次发送的数据包是完整的,而不是被异步操作修改了。