2012-03-22 36 views
1

我正在使用.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

不工作意味着什么?它阻塞了吗?或者它返回-1?或抛出一些异常? – Jeeva 2012-03-22 04:15:36

+0

以及接收方法的代码在哪里?或者那是否意味着是袜子。接受?什么是FLASHNET_CMD_LENGTH设置为? – 2012-03-22 05:27:59

+0

@Jeeva它引发异常“现有连接被远程主机强行关闭”。 – Bruce 2012-03-22 05:54:18

回答

1

问题可能是这些

  • 另一个端点可能已经关闭了连接
  • 您Receive方法阻止,因为没有数据被其它客户端

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