110,538
社区成员
发帖
与我相关
我的任务
分享
At 2014/9/30 11:23:03 , 执行命令内容时出现错误 , 原因来自于 : 远程主机强迫关闭了一个现有的连接。 在 System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
在 DEC.SocketCommon.SocketCommonObject.SendCommand(Socket sendSocket, Byte[] messageUTF8, Int32 commlen, Int32 paramlen) 位置 e:\Work\WinForm_Socket_Server\BLL\SocketCommonObject.cs:行号 73
在 DEC.SocketCommon.SocketCommonObject.SendCommand(Socket sendSocket, String commandText, String parameText, String valueText, Boolean isEncode) 位置 e:\Work\WinForm_Socket_Server\BLL\SocketCommonObject.cs:行号 38
在 DEC.SocketServer.SocketServerObject.SendCommand(AsyncUserToken token, String commandText, String parameterText, String valueText) 位置 e:\Work\WinForm_Socket_Server\SocketServer\SocketServerObject.cs:行号 301
在 DEC.SocketServer.SocketServerObject.ProcessCommand(AsyncUserToken token, String strCommand, String strParameter, String strValue) 位置 e:\Work\WinForm_Socket_Server\SocketServer\SocketServerObject.cs:行号 544
IPEndPoint iepclient = new IPEndPoint(IPAddress.Any, m_listenningClientPort)
listenSocket = new System.Net.Sockets.Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(localEndPoint);
问题就在这里:
我后来改成了真实的IP地址:
IPEndPoint iepclient = new IPEndPoint("172.16.3.145", m_listenningClientPort)
listenSocket = new System.Net.Sockets.Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(localEndPoint);
问题就消失了。。。
但是,很让人费解的一点是,从IPAddress.Any自身的意义,以及官方的解释来看,用IPAddress.Any都没有问题。。。。
为什么我这里就非要指定具体的IP呢?有高人指点一下么?谢谢!
m_autoSocket.SocketConnected += new EventHandler<SocketEventArgs>(Socket_Connected);
m_autoSocket.SocketReceived += new EventHandler<SocketEventArgs>(Socket_Received);
m_autoSocket.SocketSended += new EventHandler<SocketEventArgs>(Socket_Send);
m_autoSocket.SocketDisConnected += new EventHandler<SocketEventArgs>(Socket_DisConnected);
try
{
//开始运行
m_autoSocket = new SocketClientObject();
m_autoSocket.SocketTimeOutMS = (int)m_socketTimeOut;
m_autoSocket.StartTime = DateTime.Now;
m_autoSocket.SocketConnected += new EventHandler<SocketEventArgs>(Socket_Connected);
m_autoSocket.SocketReceived += new EventHandler<SocketEventArgs>(Socket_Received);
m_autoSocket.SocketSended += new EventHandler<SocketEventArgs>(Socket_Send);
m_autoSocket.SocketDisConnected += new EventHandler<SocketEventArgs>(Socket_DisConnected);
//连接Socket服务端
//并发送自描述信息
/*该信息包括:
* ①本机mac地址
* ②本机相关业务信息
*/
GetUserFace();
//将"用户信息"拼写为xml格式内容
string localBusinessInfo = GetUserInfoByXML();
bool isConnected = m_autoSocket.Connect();
if (isConnected)
{
bool isregister = m_autoSocket.SendRegister(localBusinessInfo);
if (!isregister) return;
//接收命令
bool result = true;
while (result)
{
result = m_autoSocket.ReceiveCommand();
}
}
else
{
string _message = "创建套接字连接失败 , 请联系管理员 ! ";
slog.WriteLog(_message);
}
}
catch (SocketException sex)
{
if (sex.ErrorCode == 10004)
{
slog.WriteLog(sex.Message);
}
else if (sex.ErrorCode == 10061 || sex.ErrorCode == 10060)//server端服务未启动
{
slog.WriteLog("无法创建套接字连接 , 原因来自于 :" + sex.Message);
MessageBox.Show("无法创建套接字连接 , 原因来自于 : 无法连接远程服务器或远程服务未开启。请联系管理员。");
NullObjectEventHandler nullobj = delegate()
{
setStartAndStopButton(true);
};
btnStart.Invoke(nullobj);
WriteLog("Start_1");
CloseAndStop();
}
else
{
MessageBox.Show("无法创建套接字连接 , 请将以下错误信息发送给管理员。错误信息 : " + sex.Message);
slog.WriteLog(sex.Message + sex.StackTrace);
NullObjectEventHandler nullobj = delegate()
{
setStartAndStopButton(true);
};
WriteLog("Start_2");
btnStart.Invoke(nullobj);
CloseAndStop();
}
}
catch (Exception ex)
{
MessageBox.Show("无法创建套接字连接 , 请将以下错误信息发送给管理员。错误信息 : " + ex.Message);
slog.WriteLog(ex.Message + ex.StackTrace);
NullObjectEventHandler nullobj = delegate()
{
setStartAndStopButton(true);
};
btnStart.Invoke(nullobj);
WriteLog("Start_3");
CloseAndStop();
}
只在catch里面有关闭动作,但是日志并没有记录到有错误发生。
if (m_first_tcpClient == null || !m_first_tcpClient.Connected) return false;
#region 解析包
int revbuff_offset = 0;
do
{
byte[] tmpreceive = new byte[ProtocolConst.ReceiveBufferSize];
revbuff_offset = m_first_tcpClient.Receive(tmpreceive);
this.m_syncUserToken.ReceiveBuffer.WriteBuffer(tmpreceive, m_syncUserToken.ReceiveBuffer.DataCount, revbuff_offset);
} while (!this.DecodePacket(this.m_syncUserToken));
slog.WriteLog("接收到了" + m_syncUserToken.ReceiveBuffer.DataCount .ToString()+ "字节");
if (m_syncUserToken.ReceiveBuffer.DataCount > 0)
{
//按照长度取回解码后的命令、参数和值
m_command = ProtocolCommon.GetCommandTextUTF8(this.m_syncUserToken.ReceiveBuffer.Buffer, 0);
m_parameters = ProtocolCommon.GetParametersUTF8(this.m_syncUserToken.ReceiveBuffer.Buffer, 0);
m_values = ProtocolCommon.GetValuesUTF8(this.m_syncUserToken.ReceiveBuffer.Buffer, 0);
//event
if (SocketReceived != null)
{
SocketReceived(this, new SocketEventArgs(m_syncUserToken));
}
//更新活跃时间点
m_syncUserToken.ActiveDateTime = DateTime.Now;
//处理命令和命令内容
bool result = this.ProcessCommand(m_command, m_parameters, m_values);
}
else
{
slog.WriteLog(string.Format("远程服务器主动关闭了连接 , 本地 :{0} 远端 :{1}", m_first_tcpClient.LocalEndPoint.ToString(), m_first_tcpClient.RemoteEndPoint.ToString()));
ClosedSocketClient();
return false;
}
#endregion
this.m_syncUserToken.ReceiveBuffer.Clear();
this.m_syncUserToken.ReceiveBuffer.Buffer = new byte[0];
//投递下次请求
//this.ReceiveCommand();
return true;
在关闭连接的地方,我都插入了日志,没有记录到是程序内部主动关闭的。
while (true)
{
Socket s = socket.Accept();
s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
new AsyncCallback((IAsyncResult ir) =>
{
//处理客户端发送的数据
//...
s.Send(buffer); //向客户端发送响应的数据
}), null);
}
代码只是一些示例,当然要做的处理不止这些,比如异常处理,对接收数据的处理等等 int sendbytes = sendSocket.Send(m_sendBuffer.Buffer, 0, totalLength, SocketFlags.None);