Socket 几个简单的小问题,请教高手

hbbliyong 2010-05-24 06:34:16
问题1:错误信息

System.Net.Sockets.SocketException: The socket is not connected
at System.Net.Sockets.Socket.get_RemoteEndPoint () [0x00000]
at bykj.dl.Class_DL_Real_CEMS_ReceiveAndSend.ListenStart_Client () [0x00000] 实时监听错误:.

问题2:错误信息

System.SystemException: GB18030 INTERNAL ERROR (should not happen): GBX 88 35 c9 30
at I18N.CJK.GB18030Source.FromGBX (System.Byte[] bytes, Int32 start) [0x00000]
at I18N.CJK.GB18030Decoder.GetCharCount (System.Byte[] bytes, Int32 start, Int32 len) [0x00000]
at I18N.CJK.GB18030Encoding.GetCharCount (System.Byte[] bytes, Int32 start, Int32 len) [0x00000]
at System.Text.Encoding.GetChars (System.Byte[] bytes, Int32 index, Int32 count) [0x00000]
at System.Text.Encoding.GetString (System.Byte[] bytes, Int32 index, Int32 count) [0x00000]
at bykj.dl.Class_CD_Receive.ListenStart_Client () [0x00000] .

问题3:错误信息

System.SystemException: GB18030 INTERNAL ERROR (should not happen): GBX 88 37 88 33
at I18N.CJK.GB18030Source.FromGBX (System.Byte[] bytes, Int32 start) [0x00000]
at I18N.CJK.GB18030Decoder.GetCharCount (System.Byte[] bytes, Int32 start, Int32 len) [0x00000]
at I18N.CJK.GB18030Encoding.GetCharCount (System.Byte[] bytes, Int32 start, Int32 len) [0x00000]
at System.Text.Encoding.GetChars (System.Byte[] bytes, Int32 index, Int32 count) [0x00000]
at System.Text.Encoding.GetString (System.Byte[] bytes, Int32 index, Int32 count) [0x00000]
at bykj.dl.Class_CD_Receive.ListenStart_Client () [0x00000] .

请高手解答,不知道为什么出的错
...全文
283 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbbliyong 2010-05-27
  • 打赏
  • 举报
回复
自己顶下,楼上的不错……有没有给出上述问题的解答?
upc_xiaowei 2010-05-26
  • 打赏
  • 举报
回复
有个catch忘记写了,就是这么个过程
upc_xiaowei 2010-05-26
  • 打赏
  • 举报
回复

private void StartListening()
{

try
{
while (true)
{

Socket ClientSocket =server.Accept();
Thread ThreadClientService = new Thread(new ParameterizedThreadStart(ServiceClient));
ThreadClientService.IsBackground = true;
ThreadClientService.Start(ClientSocket);
}
}
catch
{
StatusContentLabel.Text = "终端不在线!";
}
}

// 当服务器端接收到一个来自客户端的连接请求后,它就打开一个ServiceClient()线程来服务客户端。
private void ServiceClient(object socket)
{
Socket client = (Socket)socket;
bool keepalive = true; //各个客户Socket线程存活的标识

while (keepalive)
{
byte[] DataFromSingleDTU=new byte[128];
try
{
client.Receive(DataFromSingleDTU, DataFromSingleDTU.Length, SocketFlags.None);
}
}
}
upc_xiaowei 2010-05-26
  • 打赏
  • 举报
回复
[code=C#]
private void StartListening()
{

try
{
while (true)
{

Socket ClientSocket =server.Accept();
Thread ThreadClientService = new Thread(new ParameterizedThreadStart(ServiceClient));
ThreadClientService.IsBackground = true;
ThreadClientService.Start(ClientSocket);
}
}
catch
{
StatusContentLabel.Text = "终端不在线!";
}
}

// 当服务器端接收到一个来自客户端的连接请求后,它就打开一个ServiceClient()线程来服务客户端。
private void ServiceClient(object socket)
{
Socket client = (Socket)socket;
bool keepalive = true; //各个客户Socket线程存活的标识

while (keepalive)
{
byte[] DataFromSingleDTU=new byte[128];
try
{
client.Receive(DataFromSingleDTU, DataFromSingleDTU.Length, SocketFlags.None);
}
}
}
hbbliyong 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 upc_xiaowei 的回复:]
我的意思是一个套接字只能对应一个连接,如果开新的线程,新的连接会把你原来的连接给挤占了,所有socket不能用全局或静态。
如果你的程序是这个问题,就按我说的做,如果不是我就没办法了
[/Quote]可以给一个具体的例子吗?
upc_xiaowei 2010-05-25
  • 打赏
  • 举报
回复
Thread(new ParameterizedThreadStart(ReceiveTimeCommand));
这个参数parameterizedthreadstart是带参数的线程
和threadstart不一样
就是我那样用
hbbliyong 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 upc_xiaowei 的回复:]
你是用多线程解决多客户机问题?
如果是:
ANewSocket这个不能是全局或静态,它会被多个连接共享,所以会出错。
把它设置成局部变量吧,然后用带参数的线程,
socket anewsocket;
Thread AlistenTime = new Thread(new ParameterizedThreadStart(ReceiveTimeCommand));
AlistenTime……
[/Quote]
请问,我怎么在方法ReceiveTimeCommand中引用anewsocket?
hbbliyong 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
等你确定具体的出现异常的代码,并且可以在异常时立即进入调试器,再问问题。

先搞明白vs下的调试技术,然后再搞技术问题。
[/Quote]
呵呵,这个是程序运行日志里面的内容,是在给客户使用过程中出现的问题。呵呵,如果能直接调试出这些问题,就不会麻烦诸位高手了,这个事给客户运行很长时间才出的问题。以前曾听你介绍过长连接,可以给一个长连接的例子吗?
upc_xiaowei 2010-05-25
  • 打赏
  • 举报
回复
你是用多线程解决多客户机问题?
如果是:
ANewSocket这个不能是全局或静态,它会被多个连接共享,所以会出错。
把它设置成局部变量吧,然后用带参数的线程,
socket anewsocket;
Thread AlistenTime = new Thread(new ParameterizedThreadStart(ReceiveTimeCommand));
AlistenTime.start(anewsocket);
upc_xiaowei 2010-05-25
  • 打赏
  • 举报
回复
我的意思是一个套接字只能对应一个连接,如果开新的线程,新的连接会把你原来的连接给挤占了,所有socket不能用全局或静态。
如果你的程序是这个问题,就按我说的做,如果不是我就没办法了
hbbliyong 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 upc_xiaowei 的回复:]
Thread(new ParameterizedThreadStart(ReceiveTimeCommand));
这个参数parameterizedthreadstart是带参数的线程
和threadstart不一样
就是我那样用
[/Quote]可以用你这种方法应用一下,但这是不是造成我几个错误的原因呢?期待接待……
uc_xkj1 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sp1234 的回复:]
等你确定具体的出现异常的代码,并且可以在异常时立即进入调试器,再问问题。

先搞明白vs下的调试技术,然后再搞技术问题。
[/Quote]

调试看在哪步下出错
  • 打赏
  • 举报
回复
等你确定具体的出现异常的代码,并且可以在异常时立即进入调试器,再问问题。

先搞明白vs下的调试技术,然后再搞技术问题。
hbbliyong 2010-05-24
  • 打赏
  • 举报
回复
呵呵,不知道具体是哪一段代码处问题了
  private static void ListenStart_Client()
{
//创建连接点,本地IP与CEMS实时数据通信端口
IPEndPoint AIPAndPort = new IPEndPoint(Class_Const.m_LOCALHOSTIP, Class_Const.m_DL_CEMSPORT_REALDATA);
if (m_client_socket != null)
{
m_client_socket.Close();
}
//创建SOCKET并连接
m_client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

try
{
m_client_socket.Bind(AIPAndPort);
m_client_socket.Listen(10);

//进行侦听
while (true)
{
try
{
ANewSocket = m_client_socket.Accept();

//获取主机的IP与端口
string AIpAndPort = ANewSocket.RemoteEndPoint.ToString();
string AcontectIP = AIpAndPort.Substring(0, AIpAndPort.IndexOf(':'));
//判断链接iP是否为电力中心IP
if (Class_Const.m_DL_IP.IndexOf(AcontectIP) != -1)
{
bool AisNotExist = true;
for (int i = 0; i < Class_Const.m_DL_CEMS_Links.Count; i++)
{
if (Class_Const.m_DL_CEMS_Links[i].RemoteEndPoint.ToString().Contains(AcontectIP))
{
if (Class_CommonFun.CheckIsFluency(Class_Const.m_DL_CEMS_Links[i]))
{
AisNotExist = false;
break;
}
else
{
Class_Const.m_DL_CEMS_Links[i].Shutdown(SocketShutdown.Both);

Class_Const.m_DL_CEMS_Links[i].Close();
Class_Const.m_DL_CEMS_Links.Remove(Class_Const.m_DL_CEMS_Links[i]);
break;
}
}
}
//把IP放入连接IP集合
if (AisNotExist)
{
//新加
ANewSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
Class_Const.m_DL_CEMS_Links.Add(ANewSocket);
Class_Log.ShowLogInWindow(string.Format("CEMS电力数据调度:{0}已经连接成功", AcontectIP), 2);
Thread AlistenTime = new Thread(new ThreadStart(ReceiveTimeCommand));
AlistenTime.Name = AIpAndPort;
AlistenTime.Start();
}
else
{
ANewSocket.Shutdown(SocketShutdown.Both);
ANewSocket.Close();
}
}
else
{
ANewSocket.Shutdown(SocketShutdown.Both);
ANewSocket.Close();
}
}
catch (Exception ex)
{
Class_Log.ShowLogInWindow(string.Format("CEMS实时监听错误:{0}", ex.ToString()), 1);
}
}
}
catch (Exception ex)
{
Class_Log.ShowLogInWindow(string.Format("CEMS实时数据监听绑定出错:{0}", ex.ToString()), 1);
}
skep99 2010-05-24
  • 打赏
  • 举报
回复
上代码

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧