用于同步的C#客户端套接字

时间:2016-11-05 09:33:13

标签: c# sockets synchronous

我有一个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);

1 个答案:

答案 0 :(得分:0)

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

然后你应该首先检查你的收益是否完全取消。您可能会收到0,这意味着远程关闭了套接字。如果是这样的话bytes[0]将产生在接收开始之前存储在其中的任何内容。

您还应该正确关闭套接字。如果它发生在代码示例中并不明显,但如果从带有异常的代码返回它可能会丢失。