socket-buf 难题!(本人分数不多了,100分是俺所有家当)(请勿灌水)(100分)

  • 主题发起人 主题发起人 Tonny123
  • 开始时间 开始时间
T

Tonny123

Unregistered / Unconfirmed
GUEST, unregistred user!
本人使用 socket开发组件 用于实现 服务器和客户机之间的 sql 传递

服务器(接收sql 执行 或 转发), 客户端 均使用
ctNonBlocking 方式
自定义高层协议
问题1: 当客户机向服务器 连续发送 1000条消息时候(我这里是报头+sql语句)
服务器缓冲区溢出 数据丢失
问题2: 我把1000条记录一次发送(打成大包 10K 以上) 服务器出现溢出
socket 默认的buf为 8K 请问如何设置默认buf大小 ?
本人的理解,请高手指正:
//问题出在 1。发送者可以很快的发送 而接收者 要使用收到的sql操作数据库 速度跟不上。
2。即使1000条记录的大包 服务器可以接收,多个客户机一起发送时候又如何
一样要溢出。
3。如果接收缓冲区设置足够大是否可以解决问题?(如何设置)
3。如果服务器收到一个包以后就把其buf设置为0 是否可以解决以上问题?
4。使用多线程是否可以解决以上问题?
 
如果你一定要把数据打成一个大包那么用什么办法也没法彻底解决这种问题,要想保证数据传输的
稳定和有效就必须将大包拆分成多个小包进行传输!
 
谢谢了
分小包是可以。。但是如果多个客户器一起发送的话。。服务器缓冲又溢出了。。
这个问题如何避免 ,请战鹰指教。。。
 
在服务器端限制同时联接的数量,以保证同时发送过来的小包不至过多引起溢出
 
你接受到数据后,就马上copymemory到一个临时区分析,同时把buf清零,应该没有什么大问题
 
你可以用SO_RCVBUF和SO_SNDBUF来设置发送和接受缓冲区。
 
谢谢各位大虾
to 张无忌
我也考虑到把buf清空 现在就被卡在不知道如何清空服务器接收缓冲区

请指教
 
SetSockOpt(Self.Socket.SocketHandle,SOL_SOCKET,SO_SNDBUF,PChar(@bufsize),1024*1024);
SetSockOpt(Self.Socket.SocketHandle,SOL_SOCKET,SO_RCVBUF,PChar(@bufsize),1024*1024);
请解释一下各个参数的具体意义

特别是PChar(@bufsize) 不知道如何指定为服务器的接受缓冲区
 
Setsockopt(ThreadSocket,SOL_SOCKET,SO_RCVBUF,Buffer,10240);
你一个参数是TSocket类型,第二个参数是设置参数类型,第三个参数是具体的设置选项
第四个参数是缓冲区开始指针,是PChar类型,第四个参数是缓冲区大小
 
如果是你上面的代码可以这样清空缓冲
buffer:array[1..1024*1024]of char;
FillChar(buffer,1024*1024,0);
 
to 张无忌
小弟愚昧:我认为socket默认的缓冲区 和我们自己定义的缓冲区应该是两回事啊。。
即使我们指定自定义的buf为空 ,服务器应该还是可以接收客户机的信息呀?
请不吝指教.谢谢。。
 
确实如你所说,你把BUF设为0也可以收到数据,而且在重叠操作可以提供性能
因为TCP堆栈不需要中间缓冲,这只在要同时有多个接受调用下才有效,如果
只进行一次接受,可能对性能造成严重影响,因为除非指定一个缓冲区,而且
准备接受数据,否则系统是不会接受如何进入的数据的
 
要想解决大量连接建立以后产生的溢出必须通过流量控制,客户端在发送数据后必须
等待服务器返回预先制定格式的数据包来确认发送成功与否,如果发送成功则继续发
送下一个包,如果不成功则重发该包,当然你也可以采用异步方式即客户端一次发送
多个包(最大包数要事先约定)然后等待服务器端的反馈!服务器可以通过对数据包
的反馈来对上行的流量进行限制,这样就可以保证在某个时间内不会有大量的数据
包造成缓存区的溢出。

反正通讯协议也是你自己制定,你可以通过协议来避免大量的问题,而不需要通过编
程技巧。一个好的通讯协议可以解决你不少的问题!
 
后退
顶部