TcpClient连续发送数据以后报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次

fihuang 2011-03-23 02:34:37
客户端连续不断的用TcpClient往服务器发送数据,服务器端开了一个线程去监听端口并且接收处理数据。
但是在发送了3800次左右以后,发送数据的地方报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
主要代码如下:
客户端:

public void Post(byte[] b)
{
TcpClient client = null;
NetworkStream ns = null;
try
{
client = new TcpClient();
client.Connect(Ip, Port); //这个方法被调用了3800次左右以后,这里报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
client.ReceiveTimeout = 300000;
ns = client.GetStream();

//发送至服务器端
ns.Write(b, 0, b.Length);
ns.Flush();
}
catch (Exception e)
{
}
finally
{
if (ns != null)
{
ns.Close();
ns.Dispose();
}
if (client != null)
{
client.Close();
}
}
}


服务器端:

public class ServerClient
{
private TcpListener tcpListener = null;

//下面这个线程用来监听端口,在服务器开启以后就启动下面的线程
private Thread threadTcp = null;
threadTcp = new Thread(new ThreadStart(tcpServerProcess));
threadTcp.Start();

private void tcpServerProcess()
{
try
{
tcpListener = new TcpListener(IPAddress.Any, Port);
tcpListener.Start();

while (true)
{
try
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(new WaitCallback(ReciveTcp), tcpClient);
}
catch
{
}
}
}
catch
{
}
}

private void ReciveTcp(object state)
{
TcpClient client = state as TcpClient;
NetworkStream ns = null;
try
{
client.ReceiveTimeout = 300000;
ns = client.GetStream();
byte[] bytes = new byte[client.ReceiveBufferSize];
ns.Read(bytes, 0, (int)client.ReceiveBufferSize);
//处理数据
}
catch
{
}
finally
{
if (ns != null)
{
ns.Close();
ns.Dispose();
}
if (client != null)
{
client.Close();
}
}
}
}
...全文
1184 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xpilot 2011-09-09
  • 打赏
  • 举报
回复
12楼的东东不错,收下了!
fihuang 2011-03-24
  • 打赏
  • 举报
回复
上面两位说的服务器端用异步是什么意思? 是只异步监听端口 还是接收到数据以后异步处理?
我上面的代码是接收到数据以后异步处理。
fihuang 2011-03-24
  • 打赏
  • 举报
回复
我写的服务器端用的是异步的 用线程池来处理的吧 大家再帮我看看
ThreadPool.QueueUserWorkItem(new WaitCallback(ReciveTcp), tcpClient);
chuzhaowei 2011-03-24
  • 打赏
  • 举报
回复
服务端端最好用异步的,客户端可以用阻塞的方式。
ycproc 2011-03-24
  • 打赏
  • 举报
回复
但是在发送了3800次左右以后,发送数据的地方报错:
----------------------------------------------

你做的同步的话 3800 估计也是到头了

你改成异步的 7500左右 或者做个连接池

加个端口复用 基本这些问题 都解决了

效率也会提高
se7en 2011-03-24
  • 打赏
  • 举报
回复
我推荐你用多线程异步的方式来处理 ,不管是速度还是准确性都会相对的更高。
fihuang 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beargo 的回复:]

client.Connect(Ip, Port);
放到外面吧..不需要每发送一个包就连一次的...错误就发生在这里...
[/Quote]每发送一次就连接一次 从逻辑上来说没有问题 数据量太大的情况下就把连接占满了 就像数据库一样
现在考虑做一个长连接 但还是报错
adam0708 2011-03-24
  • 打赏
  • 举报
回复
又碰到tcp/ip的问题

我收藏了个类库,呵呵,一个个传太麻烦了,贡献出来吧(收两分哈)

点击这里
fihuang 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beargo 的回复:]

client.Connect(Ip, Port);
放到外面吧..不需要每发送一个包就连一次的...错误就发生在这里...
[/Quote]怎么保证tcpclient一直开着 我用netstream写完数据以后 把netstream关掉 tcpclient就自动关掉了 下一次还是需要重新连接tcpclient
fihuang 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 founderfang 的回复:]

在出错的时候试一下telnet去那个端口,看看server端是不是的确没反应了。另外看一下server端是不是每个client disconnect后ReceiveTcp也退出了。
所谓同步3800异步7500还有连接池什么的是在误导,那是并发连接数,跟你这个不相关。
[/Quote]有种说法是TcpClient关闭以后 系统会把它修改成wait state,等待一段时间以后再将其关闭。不知道大家有没有碰到过这样的情况?
founderfang 2011-03-24
  • 打赏
  • 举报
回复
在出错的时候试一下telnet去那个端口,看看server端是不是的确没反应了。另外看一下server端是不是每个client disconnect后ReceiveTcp也退出了。
所谓同步3800异步7500还有连接池什么的是在误导,那是并发连接数,跟你这个不相关。
beargo 2011-03-23
  • 打赏
  • 举报
回复
client.Connect(Ip, Port);
放到外面吧..不需要每发送一个包就连一次的...错误就发生在这里...

111,094

社区成员

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

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

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