C
chimney
Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题在论坛上经常有人问,好像没有好的、真正能解决问题的建议,我在写网络软件时也碰到了这些问题,希望大家能够探讨一下。
我主要是采用非阻塞模式,数据格式定义如下:
TFrameData=Packet Record
TransCode:TTransCode//主要是判断数据包该作什么操作
Data:Array[0..BufferSize] of Char//数据单元
end;
在发送前根据具体操作给TransCode赋值,将数据压入Data中,然后用SendBuf将数据包发出去:While SendBuffLength = -1 do
SendBuffLength:=ServerSocket.Socket.SendBuf(FrameData,DataSize)//这里的DataSize不一定等于SizeOf(FrameData),而是根据数据的实际长度+SizeOf(TransCode)
接收时:
While RecieveBufReturn < Socket.ReceiveLength Do
RecieveBufReturn:=Socket.ReceiveBuf(FrameData,Socket.ReceiveLength);
然后根据TransCode的直执行相应的操作:
Case TransCode of
a://相应操作
b:
end;
但时实际运行中总有数据没有收到,特别是在发送端发送频率比较高的时候,我想作为TCP协议,数据肯定是已经发送到目的地了,应该是接收时出现问题,会不会是因为多段数据同时到达而Socket只触发一次Read事件而导致后一段数据虽然接收了但在Case这一步被丢弃了?如果这样,在每一段数据的后面加一个分隔符,同时在Read的事件中用一个循环应该是可以解决的。
有些人提出可以用Sleep进行延迟,可能可以解决一些问题,但我想应该不是好办法,特别对于时间要求比较高的系统,我想应该在协议定义和系统逻辑处理上下功夫,不知道各位有什么想法,希望讨论。
我主要是采用非阻塞模式,数据格式定义如下:
TFrameData=Packet Record
TransCode:TTransCode//主要是判断数据包该作什么操作
Data:Array[0..BufferSize] of Char//数据单元
end;
在发送前根据具体操作给TransCode赋值,将数据压入Data中,然后用SendBuf将数据包发出去:While SendBuffLength = -1 do
SendBuffLength:=ServerSocket.Socket.SendBuf(FrameData,DataSize)//这里的DataSize不一定等于SizeOf(FrameData),而是根据数据的实际长度+SizeOf(TransCode)
接收时:
While RecieveBufReturn < Socket.ReceiveLength Do
RecieveBufReturn:=Socket.ReceiveBuf(FrameData,Socket.ReceiveLength);
然后根据TransCode的直执行相应的操作:
Case TransCode of
a://相应操作
b:
end;
但时实际运行中总有数据没有收到,特别是在发送端发送频率比较高的时候,我想作为TCP协议,数据肯定是已经发送到目的地了,应该是接收时出现问题,会不会是因为多段数据同时到达而Socket只触发一次Read事件而导致后一段数据虽然接收了但在Case这一步被丢弃了?如果这样,在每一段数据的后面加一个分隔符,同时在Read的事件中用一个循环应该是可以解决的。
有些人提出可以用Sleep进行延迟,可能可以解决一些问题,但我想应该不是好办法,特别对于时间要求比较高的系统,我想应该在协议定义和系统逻辑处理上下功夫,不知道各位有什么想法,希望讨论。