我有这个方法,用来发送传输对象
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 7777);
Socket sockListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sockListener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sockListener.Bind(ipEnd);
sockListener.Listen(100);
s = sockListener.Accept();
private void sendToClient(Transfer.Transfer tt)
{
byte[] buffer = new byte[15000];
IFormatter f = new BinaryFormatter();
Stream stream = new MemoryStream(buffer);
f.Serialize(stream, tt);
Console.WriteLine("1/3 serialized");
stream.Flush();
Console.WriteLine("2/3 flushed stream");
s.Send(buffer, buffer.Length, 0);
Console.WriteLine("3/3 send to client");
}
奇怪的是,我调用它的前两次它都能工作,然后在第三次调用时它挂在s.send()上。
如果我想发送字符串而不是传输,这是一样的。
@nos的注释可能是正确的,TCP发送缓冲区可能已满,对s.Send()的第三次调用将被阻止,直到数据通过网络发送。您可以这样设置使用的缓冲区大小:
Socket s = sockListener.Accept();
s.ReceiveBufferSize = 1024 * 64;
s.SendBufferSize = 1024 * 64;
您应该能够通过将缓冲区大小设置为发送数据大小的较大倍数来确认您的问题。
此外,正如建议的那样,您应该检查客户端以确保其正确读取数据。