为什么要让程序暂停下才可以正常接收?
- Delphi(Pascal) code
with AdoQuery do begin Close; SQL.Clear; sql.Text :='select * from UserInfo where owner= '+Quotedstr(ClientSession.Owner); Open; while not Eof do begin SendClientSession.Name:=FieldByName('Name').AsString; buffer[0]:=SSKReturnClinet; CopyMemory(@buffer[SizeOf(byte)],@src,srclen); CopyMemory(@buffer[SizeOf(byte)+srclen],@SendClientSession,SizeOf(TClientSession)); client.Send(@buffer,SizeOf(byte)+srclen+sizeof(TClientSession)) ; Next; Sleep(10);//暂停下才可以把所有的循环都发送出去,如果不加这句,那边只可以接收2个。 end; end;[解决办法]
连续发送时,可能多个数据合在一起发送了,假设依次发送A,B,C,接收的时候可能就会是这样,A,BC,这样的,看到你好象是带了长度的,接受的时候,根据长度判断一下,到底收到了几个,这里最好判断收到的长度,否则容易有溢出漏洞.
比如:接受到了5????3?? 那么就可以认为收到了2个数据包,分来处理就行了
还有一种可能:你检查一下send的返回值,如果是阻塞方式,返回值=SendLength才对,如果不等那就没提交成功.
看到这句:
SendClientSession.Name:=FieldByName('Name').AsString;
你的SendClientSession.Name 是定义成的String(n)这种吗?
如果是String/AnsiString/UnicodeString/WideString都是不行的。