c#客户端套接字用于同步

本文关键字:同步 用于 套接字 客户端 | 更新日期: 2023-09-27 18:16:40

我有一个第三方服务器,在那里我发送数据,然后等待响应。

它将首先返回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);

c#客户端套接字用于同步

这段代码看起来有问题。首先,你必须接受TCP是一个流,没有数据包。这意味着即使客户端发送给定长度的内容,您也不能期望在一个回合内接收到它。这意味着如果你做eftSocket.Receive(bytes),你可能会收到从远程发送的任意数量的字节,不一定是第一次调用中的ack字节,剩下的东西在第二次调用中。您唯一知道的是,您不会收到超过bytes.Length。如果您交给它一个非常大的缓冲区,您可能会在一个回合中接收到所有内容(ACK +剩余数据)。因此,您应该始终首先检查返回值。如果您期望更多的字节,则使用所需的偏移量重复Receive调用。

那么您应该首先检查您的接收是否成功。您可能会收到0,这意味着远程端关闭了套接字。如果是这种情况,bytes[0]将产生在Receive开始之前存储在其中的任何内容。

您还应该正确地关闭您的套接字。如果发生这种情况,从代码示例中并不明显,但如果从代码中返回一个Exception,则可能会丢失。