关于socket的发送和socket缓存的问题!(200分)

  • 主题发起人 主题发起人 yzlee
  • 开始时间 开始时间
Y

yzlee

Unregistered / Unconfirmed
GUEST, unregistred user!
请问socket的缓存的大小可以设置吗?
我现做一程序,要求客户机发送一组数据,服务器必须立即收到,并在屏幕上显示出来。
但是socket的sendbuf命令有时会将本来几次发送的数据变成累积为一次发出去了。
我的程序是40毫秒发送600-1500个字节(这个条件不能更改)。请问有无方法能使
sendbuf命令立即发送?
 
sendbuf不是有一个返回值,你判断一下是否发送全部数据,
 
to hua8hua:
sendbuf好像只是将数据放入socket的缓存区,看这个函数的返回值是没用的。
 
修改缓冲区:
setsockopt 设置SO_SNDBUF为发送缓冲区大小,SO_RCVBUF为接收缓冲区大小

立即发送:
setsockopt 设置TCP_NODELAY为true,不将小包合并为大包

 
同意pipi的意见
 
对于这个应用显然用setsockopt,或者是设置发送缓冲区为零,这样可以让数据
立即发送,另外接收端不需要设置接收缓存的大小,只要处理的足够快,在下一
个包来之前就处理完当前的包。如果处理得不够快的话设置接收缓冲区大小为零,
防止TCP将多个包合并成一个包,但是这样一旦没有处理过来就会丢包,然后进行
TCP的重传,当然如果接收处理实在太慢这样会出问题的,重传太多不满足实时性
的要求那就只能用UDP了
 
to: Pipi,seawalker
请简单写一个设缓存区的例子(语句)。
 
你用SendBuf看来是在用TClientSocket吧
可以这样:
如果sock就是那个TClientSocket,bufsize:=1000是一个integer,则
设置发送缓冲区长度用
SetSockOpt(sock.Socket.SocketHandle, SOL_SOCKET, SO_SNDBUF, PChar(@bufsize),
sizeof(integer));
设置接收缓冲区长度用
SetSockOpt(sock.Socket.SocketHandle, SOL_SOCKET, SO_RCVBUF, PChar(@bufsize),
sizeof(integer));

实际上你为什么不用UDP呢?使用winsock.pas里面提供的winsock API就可以了,既能
保持数据边界也能实时,使用也很简单,市面上有很多书讲winsock的,而且实际中
现在的实时性服务都用的UDP
 
to: seawalker
请再写个设TCP_NODELAY的例子,谢谢了。

 
var
opt : integer;
.....
opt := 1;
SetSockOpt(sock.Socket.SocketHandle, IPPROTO_TCP, TCP_NODELAY, PChar(@opt),
sizeof(BOOL));
BTW:
已经结束了还要我写呀,赫赫,压榨劳动力亚:)
 

Similar threads

S
回复
0
查看
742
SUNSTONE的Delphi笔记
S
S
回复
0
查看
751
SUNSTONE的Delphi笔记
S
后退
顶部