Socket问题 无法访问名为“System.Net.Sockets.Socket”的已处置对象

Labradoor 2009-11-06 02:09:37
这两天发现一个问题,我做了利用Socket在Server和Client两端接收数据:
Server程序,首先在一个端口进行Listen,收到Client端的Socket连接后接收连接,然后发送和接收数据;
在Client端的程序,建立Socket连接,发送和接收数据,最终关闭Socket。

然后运行Server,使其进入Listen状态;运行Client,建立Connect,发送和接收数据,关闭连接;在这种情况下,工作正常;

但是,我尝试在Client端的程序中每发送和接收一次数据后,就关闭一次连接;再下次的时候重新建立连接,再发送和接收数据,再关闭连接。
这时,就出现了错误,“无法访问名为“System.Net.Sockets.Socket”的已处置对象”,十分的不理解。

大家帮我分析一下,到底是怎么回事?
我写的比较罗嗦,要是您看懂的话,给点建议!多谢!
...全文
543 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziminyang 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 labradoor 的回复:]
各位说的对,我是重复的使用了已经关闭的Socket。
但是,为什么重复使用Socket建立连接、发送数据都不会报错呢?
[/Quote]

不是很懂你的问句。一般规则下,服务端有个socket是一直存在的,那就是接受新链接的那个。由Accept产生的socket一般在传递完数据后就关闭了,http服务器一般就是这种工作方式。
Labradoor 2009-11-06
  • 打赏
  • 举报
回复
各位说的对,我是重复的使用了已经关闭的Socket。
但是,为什么重复使用Socket建立连接、发送数据都不会报错呢?
Labradoor 2009-11-06
  • 打赏
  • 举报
回复
这是Client端的部分代码,出错是在第二次接收数据的时候!
Labradoor 2009-11-06
  • 打赏
  • 举报
回复
string szData;
byte[] byData;

//create a new client socket ...
m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
String szIPSelected = txtIPAddress.Text;
String szPort = txtPort.Text;
int alPort = System.Convert.ToInt16(szPort,10);

System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected);
System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);

//
// Reset
//
m_socClient.Connect(remoteEndPoint);

WaitTime();

// send
szData = "532TRESET";
byData = System.Text.Encoding.ASCII.GetBytes(szData);
m_socClient.Send(byData);

WaitTime();

// receive
byte [] buffer = new byte[1024];
int iRx = m_socClient.Receive (buffer);
char[] chars = new char[iRx];

System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
szData = new System.String(chars);
txtDataRx.AppendText(szData + "\r\n");

WaitTime();

m_socClient.Close ();

WaitTime();

//
// Login
//
m_socClient.Connect(remoteEndPoint);

WaitTime();

// send
szData = "532T123456";
byData = System.Text.Encoding.ASCII.GetBytes(szData);
m_socClient.Send(byData);

WaitTime();

// receive
iRx = m_socClient.Receive(buffer);
chars = new char[iRx];

d = System.Text.Encoding.UTF8.GetDecoder();
charLen = d.GetChars(buffer, 0, iRx, chars, 0);
szData = new System.String(chars);
txtDataRx.AppendText(szData + "\r\n");

WaitTime();

m_socClient.Close();

WaitTime();

//
// Input Name
//
m_socClient.Connect(remoteEndPoint);

WaitTime();

// send
szData = "532TUTTEST0002";
byData = System.Text.Encoding.ASCII.GetBytes(szData);
m_socClient.Send(byData);

WaitTime();

// receive
iRx = m_socClient.Receive(buffer);
chars = new char[iRx];

d = System.Text.Encoding.UTF8.GetDecoder();
charLen = d.GetChars(buffer, 0, iRx, chars, 0);
szData = new System.String(chars);
txtDataRx.AppendText(szData + "\r\n");

WaitTime();

m_socClient.Close ();
ziminyang 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qldsrx 的回复:]
Socket一旦关闭了,就只能重新new一个再连接,你肯定是重复利用了那个Close后的Socket了。
[/Quote]
我也觉得是这个问题,一般Accept会被放在一个循环里,不断接受新的connection
qldsrx 2009-11-06
  • 打赏
  • 举报
回复
Socket一旦关闭了,就只能重新new一个再连接,你肯定是重复利用了那个Close后的Socket了。
sharpe 2009-11-06
  • 打赏
  • 举报
回复
你的代码 看看。。是不是你关闭的时候,把socket已经释放了?
如果这样就只有再重新初始化

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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