我有一个3Rd派对服务器,我发送数据然后等待响应。
首先回复ack,然后回复完整的回复
我正在做这样的事情。有没有更好的方法。
//Connect
eftSocket.Connect(remoteEp);
// Encode the data string into a byte array.
byte[] msg = Encoding.ASCII.GetBytes(strRequest);
// Send the data through the socket.
int bytesSent = eftSocket.Send(msg);
//receive first time
int bytesRec = eftSocket.Receive(bytes);
//Do we get an ack,
if (bytes[0] != 6)
{
throw new Exception("Could not connect to EFT terminal");
}
//receive 2nd time
bytesRec = eftSocket.Receive(bytes);
答案 0 :(得分:0)
该代码看起来很糟糕。首先,你必须接受TCP是一个流,并且没有数据包。这意味着即使客户发送给定长度的东西,您也永远不会期望您在一个回合中收到它。这意味着如果你执行eftSocket.Receive(bytes)
,你可能会收到从远程发送的任何字节数,不一定是第一次调用中的ack字节和第二次调用中的剩余内容。你知道的唯一一件事就是你获得的收益超过bytes.Length
。如果您将它交给一个非常大的缓冲区,您可能会在一个回合中收到所有内容(ACK +剩余数据)。因此,您应该始终先检查返回值。如果你期望更多的字节重复接收调用所需的偏移量。
然后你应该首先检查你的收益是否完全取消。您可能会收到0,这意味着远程关闭了套接字。如果是这样的话bytes[0]
将产生在接收开始之前存储在其中的任何内容。
您还应该正确关闭套接字。如果它发生在代码示例中并不明显,但如果从带有异常的代码返回它可能会丢失。