如何在不关闭套接字的情况下多次调用Socket Send和Receive?

时间:2012-03-22 04:13:17

标签: c# .net sockets tcp

我正在使用.NET Socket类。

基本上我的程序是通过TCP向我的服务器发送XML命令(运行一些第三方服务),它会发回XML响应。

我想要做的是在不关闭套接字的情况下多次发送和接收,因为如果我在短时间内打开和关闭套接字太多次,服务器似乎会变慢。

我的代码版本:

//Connects to server
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipe = new IPEndPoint("123.123.123.123", 8199);
socket.Connect(ipe);

//Send my message
int sent = sock.Send(buffer, buffer.Length, SocketFlags.None); //buffer contains my XML data

//Receives respond from server
byte[] buf = new byte[65536];
int ret = socket.Receive(buffer, 0, 65536, SocketFlags.None);

//Send my message again without closing the socket
sent = sock.Send(buffer, buffer.Length, SocketFlags.None); //buffer contains my XML data

//Receives respond from server failed..
ret = socket.Receive(buffer, 0, 65536, SocketFlags.None);

第一次发送/接收工作,但不是第二次。第二次抛出异常“现有连接被远程主机强行关闭”。在发出另一个发送/接收之前,我还需要做什么?

非常感谢你阅读。

1 个答案:

答案 0 :(得分:1)

问题可能是这些

  • 其他端点可能已关闭连接
  • 您的Receive方法正在阻止,因为其他客户端没有发送任何数据

服务器可能已关闭连接,因为您可能发送了无效数据包。检查您发送的数据是否有效。调试或在服务器端有一个tcp / ip数据包监视器并检查你收到的数据包。