Socket 关闭时出现 错误:"由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。"
代码:
public void State()
{
try
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start();
}
catch (Exception ex)
{
eventLog_SendWorks.WriteEntry("监听端口线程启动错误提示:" + ex.Message, EventLogEntryType.Error);
}
}
public void Close()
{
try
{
//System.Environment.Exit(System.Environment.ExitCode);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
mythread.Abort();
}
catch (ObjectDisposedException ex)
{
eventLog_SendWorks.WriteEntry("ObjectDisposedException错误!:"+ex.Message,EventLogEntryType.Error);
}
catch (Exception ex)
{
eventLog_SendWorks.WriteEntry("关闭Socket和Thread是出错:" + ex.Message, EventLogEntryType.Error);
}
}
public static IPAddress GetServerIP()
{
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName()); //获取本地主机的地址
return ieh.AddressList[0];
}
private void BeginListen()
{
IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, 8000);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] byteMessage = new byte[1024];
socket.Bind(iep);
while (true)
{
try
{
socket.Listen(5);
Socket newSocket = socket.Accept();
newSocket.Receive(byteMessage);
newSocket.Shutdown(SocketShutdown.Both);
newSocket.Close();
string msg = Encoding.Default.GetString(byteMessage);
msg = msg.Substring(0, 13);
if (msg == "ProWorkUpdate")
{
try
{
eventLog_SendWorks.WriteEntry("数据库更新,更新数据!");
this.timer_SendMessage.Enabled = false;
if (SendTable != null)
{
SendTable.Clear();
}
dtTable = GetData(); //从数据库中读取在某一段是时间间内可能要发的事务信息
OperationDataTable(); //向发送事务表(SendTable)中添加数据
this.timer_SendMessage.Enabled = true;
}
catch (Exception ex)
{
eventLog_SendWorks.WriteEntry("触发数据更新时出错:" + ex.Message);
}
//lbl_BeginInvoke.BeginInvoke(new InvokeDelegateReadData(ReadData));
}
//Thread.Sleep(1000);
}
catch (SocketException ex)
{
//MessageBox.Show(ex.Message, "Socket错误提示!");
eventLog_SendWorks.WriteEntry("Socket连接错误提示:" + ex.Message,EventLogEntryType.Error);
}
}
}