请教3个深入Socket的难题-----分全给了 (24分)

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

terrace

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的Delphi5+Win2000,在TCP/IP下进行非阻塞的服务器端ServerSocket和客户端ClientSocket通讯,问题如下:
1:如何清空Socket的缓冲区,好象并没有Flush函数,执行ClientSocket.active:=false或ClientSocket.Socket.close是否可以清空Socket的缓冲区?
2:Socket自带的缓冲区是什么样的数据结构?(我认为应该是个循环队列,否则怎么去避免后来的数据覆盖前面的呢?)
3:客户端的Socket是单线程的还是多线程的(即是否会同一Socket同时有两个ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket)函数在执行读数据过程?),我测试的结果好象兼有单线程和多线程的表现,如果是多线程的,那么如何保证数据接收的准确性和次序一致性呢?

 
1、应该是

2、输出缓冲区的结构应该是可以看作队列
3、可以看作单线程,接收次序没问题,但是要注意发送文本数据时的粘连问题,一般要有分隔符标志。
 
1.都close了,缓冲区应该清掉了。2.就是循环队列。3,但线程。
 
1,SOCKET自己晴空缓冲,处问题是指针操作有问题。
2。这个是发送数据处理有问题
3。你看DELPHI的代码,异步模式好象是一个SOCKET分配一个窗口来处理消息
同一个SOCKET在异步模式下不可能同时READ,因为你的READ都是在他的ONREAD事件里
执行的,这里是串行的执行的。
 
1、socket缓冲区为什么要清空?是不是数据混乱了?如果这样可以close掉,让客户端重联。
2、具体缓冲区是否为环形队列不用关心,一般追求高效的通讯程序都会有自己的二级甚至三级缓存的。这样可以避免浪涌丢包现象。
3、这个不太明白,socket俺一般都是用C++的。
 
我,楼主。楼上的几位朋友,我还是有几个疑点,劳驾指点,谢谢!
问题1:ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket)函数是在什么时候触发的呢?在Socket缓冲区中有数据时还是在新数据到达Socket缓冲区时?会不会有多个该函数被执行?(如:当一个还没执行完时另一个又被触发,这样就麻烦了,数据怎么保持不乱和原数据次序一致呢)问题2:socket.ReceiveBuf执行后是否会清除缓冲区中的相应数据?问题3:请帮忙看看我的代码,我总觉得有问题(用while循环是否会导致程序陷于循环操作中而无时间去接收数据或导致接收数据很慢?是否有必要使用TCriticalSection?)
procedure TMain.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);
var PackHeader:TPackHeader;
DataTrans:array[0..10*1024-1] of char;
Data:string;
tempSize,BodySize,RecLen:integer;
P:Pointer;
ccc:TCriticalSection;
const PackHeadSize=sizeof(TPackHeader);
begin
ccc:=TCriticalSection.Create;
ccc.Enter;
while tempSize<PackHeadSize do
begin
P:=pointer(integer(@PackHeader)+tempSize);
RecLen:=socket.ReceiveBuf(p^,PackHeadSize-tempSize);
if RecLen>0 then tempSize:=tempSize+RecLen;
end;
DataTrans:=#0;
BodySize:=PackHeader.len-PackHeadSize;
tempSize:=0;
while tempSize<BodySize do
begin
RecLen:=socket.ReceiveBuf(DataTrans[tempSize],BodySize-tempSize);
if RecLen > 0 then tempSize:=tempSize+RecLen;
end;
Data:=copy(PChar(@DataTrans),0,PackHeader.len-PackHeadSize);
ccc.leave;
...
end;
 
大小为4096
客户端的Socket是单线程。
 
接受答案了.
 
后退
顶部