社区
C#
帖子详情
TCP socket 缓冲区溢出的问题
wangke_poul
2008-01-09 11:55:46
本人在做一个网络应用程序(c/s结构)
一个客户端向服务器发送数据,服务器把接受到的数据再转发到多个其他客户端
我用的是tcp协议同步阻塞模式,在转发小数据时候(小于200k)时客户端和服务器均运行正常
但一旦连续转发大数据时候,(2M左右)接受数据的客户端socket 就会报错
错误为:“缓冲区溢出或队列已满,无法进行套节字操作”。
有做过的朋友,请不吝赐教!多谢!!
...全文
1241
4
打赏
收藏
TCP socket 缓冲区溢出的问题
本人在做一个网络应用程序(c/s结构) 一个客户端向服务器发送数据,服务器把接受到的数据再转发到多个其他客户端 我用的是tcp协议同步阻塞模式,在转发小数据时候(小于200k)时客户端和服务器均运行正常 但一旦连续转发大数据时候,(2M左右)接受数据的客户端socket 就会报错 错误为:“缓冲区溢出或队列已满,无法进行套节字操作”。 有做过的朋友,请不吝赐教!多谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tsky0722
2008-01-16
打赏
举报
回复
顶下
wangke_poul
2008-01-16
打赏
举报
回复
问题解决
两个方法:
如下:
public int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent=0;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize,0,4,0);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
// MessageBox.Show(sent.ToString());
total += sent;
dataleft -= sent;
}
return total;
}//发送函数
private byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv=0;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0,4,0);
int size = 0;
size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0)
{
data = Encoding.ASCII.GetBytes("exit ");
break;
}
total += recv;
dataleft -= recv;
}
return data;
}//接收信息函数
private static int SendData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
private static byte[] ReceiveData(Socket s, int size)
{
int total = 0;
int dataleft = size;
byte[] data = new byte[size];
int recv;
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0)
{
data = Encoding.ASCII.GetBytes("exit");
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
tsky0722
2008-01-15
打赏
举报
回复
LZ的问题估计是接收和发送缓冲区溢出了,可以通过socket.SendBufferSize和socket.ReceiveBufferSize进行设置。
我也有这个错误 不过问题不一样 我用的是异步
protected virtual void AcceptConn(IAsyncResult iar)
{
//如果服务器停止了服务,就不能再接收新的客户端
if (!_isRun)
{
return;
}
//接受一个客户端的连接请求
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
//检查是否达到最大的允许的客户端数目
if (_clientCount == _maxClient)
{
//服务器已满,发出通知
if (ServerFull != null)
{
ServerFull(this, new NetEventArgs(new Session(client)));
}
}
else
{
Session newSession = new Session(client);
_sessionTable.Add(newSession.ID, newSession);
//客户端引用计数+1
_clientCount++;
//开始接受来自该客户端的数据
client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
//新的客户段连接,发出通知
if (ClientConn != null)
{
ClientConn(this, new NetEventArgs(newSession));
}
}
//继续接受客户端
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock);
}
上面红色的话 在接收2500个连接后就会报错“系统缓冲区溢出或队列已满,无法进行套节字操作”
如果删了这句话可以接收至少10000个连接 不知道哪的错 希望有牛人帮忙解决下
wangke_poul
2008-01-09
打赏
举报
回复
就剩这点分了,我再想办法加!!
Python网络编程(
socket
)
网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?答案就是
socket
.
socket
翻译为套接字,它本质就是在应用层和传输层(
TCP
/IP协议族通信)之间的一个抽象层,是一组接口,它把
TCP
/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。该课程包括OS模型,
TCP
/IP协议,
socket
函数等Python网络编程基础知识。
TCP
缓冲区 buffer 溢出导致丢包
问题
最近做项目中发现请求会有丢包现象。所以学习一下
TCP
相关的知识,记录一下作为备忘,也是练习一下写作。以下是
TCP
的一点基础知识:每个
TCP
套接字有一个发送缓冲区,我们可以用SO_SNDBUF套接字选项来更改该缓冲区的大小。当某个应用进程调用write时,内核从该应用进程的缓冲区复制所有数据到缩写套接字的发送缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据(或是应用进程的缓冲区大于套接字的...
socket
编程
缓冲区溢出
最近做项目,一个
socket
编程需要接收数据的同时进行插入操作,但是数据的访问严重拖慢了客户端接收的速度,导致udp端的默认缓冲区被占满从而导致数据丢失。学长建议了两种方案,一是扩大缓冲的容量,另一个是使用多线程。 先试了第一种方法,项目使用的是qt的
socket
,使用set
Socket
Option函数进行缓存的设置,具体的参数如下:set
Socket
Option(QAbst...
C++网络编程学习:
缓冲区溢出
与粘包分包
网络编程学习记录 使用的语言为C/C++ 源码支持的平台为:Windows / Linux 笔记一:建立基础
TCP
服务端/客户端 点我跳转 笔记二:网络数据报文的收发 点我跳转 笔记三:升级为select网络模型 点我跳转 笔记四:跨平台支持Windows、Linux系统 点我跳转 笔记五:源码的封装 点我跳转 笔记六:
缓冲区溢出
与粘包分包 笔记六网络编程学习记录一、关于
缓冲区溢出
1.
缓冲区溢出
的原因2.
缓冲区溢出
的处理方法二、粘包与分包1.粘包与分包的原因2.粘包与分包的处理方法2.1客户
缓冲区溢出
攻击
缓冲区溢出
是目前最常见的一种安全
问题
,操作系统以及应用程序大都存在
缓冲区溢出
漏洞。缓冲区是一段连续内存空间,具有固定的长度。
缓冲区溢出
是由编程错误引起的,当程序向缓冲区内写入的数据超过了缓冲区的容量,就发生了
缓冲区溢出
,缓冲区之外的内存单元被程序“非法”修改。一般情况下,
缓冲区溢出
导致应用程序的错误或者运行中止,但是,攻击者利用程序中的漏洞,精心设计出一段入侵程序代码,覆盖缓冲区之...
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章