急!急!急!求助一个有关Winsows Socket的问题(200分)

  • 主题发起人 主题发起人 大米
  • 开始时间 开始时间
您的程序不应该依赖任何假设的系统缓冲区的长度, 还是使用
自己的辅助程序,确保您所要求的数据能够全部发送成功和接收
成功.
 
我输入时遇到了与大米同样的问题:-(
var size1:integer;
if CheckSocketData(hClientSocket,recvsize)大等于0 then
begin
size1:=0;
while size1小于recvsize then
begin
size1:=size1+Recv(hClientSocket,buffer+size1,recvsize-size1,0);
sleep(100);
Inc(Error);
if Error大于100 then
begin
报错处理
Break;
end;
end;
end;
 
大家好!上午好!
今天连进来可真难,总是WEB太忙,xixi

Socket缺省的发送和接收缓冲区好象是8k吧?
我在发送一条记录时先发一个头(里面包括一些信息及记录里各个图的字节数)
然后一个个地发压缩图
接收的时候是接完了前一个,再接着接下一个
头和每个图都没有超过8k
接收端收完一条记录并成功入库后返回一个信息给发送方
发送方再发下一条记录

最让我困惑的是为什么95下很好,NT下就不行
我试过把95下的winsock.dll替换掉NT下的也没效果
 
pegasus好,你说的不应该依赖任何假设的系统缓冲区的长度
是什麽意思,能不能说清楚点?
 
我说接收缓冲区缺省下是8k是因为我在调用函数:
function SocketDataLength(hSocket:TSocket):Integer;
begin
ioctlsocket(hSocket, FIONREAD, Longint(Result))
end;
时发现如果发送方发的数据的总字节数小于8k,Result就等于
这个总字节数,如果大于8k,result就总是等于8192

这个Result应该是一次Recv所能收到的最大字节数
 
Nt下有可能是4k(这好象可以配置),把你的压缩图改为小于4k在nt下试试.
 

我在数据库里加了三条记录,其中Account名为one的记录只有一个图,字节为4858
在NT下接收这条记录每次都成功
Account名为two的记录有两个图,字节分别为4855,4869
接收这条记录时就不行
Account名为scan的记录有五个图,字节分别为2978,2884,2739,2719,3336
接收时也出问题

这几条记录在95下接收都挺好的
 
If CheckSocketData(hClientSocket,size)大于等于0 Then
begin
if (Recv(hThreadSocket,buffer,size,0)不等于size) then
begin
ErrorCode:=WSAGetLastError();
case ErrorCode of
....
报错处理
....
end;
end;

NT下接收上一篇说的帐号为one的记录的压缩图时
CheckSocketData(hClientSocket,size1)大于等于0
接下来Recv(hClientSocket,buffer1,size1,0)等于size1

接收帐号为two或scan时,到了接收第一个图时
CheckSocketData(hClientSocket,size1)大于等于0
接下来Recv(hClientSocket,buffer1,size1,0)却总是小于size1
WSAGetLastError()返回值为0

真是叫我百思不解



 
Sigh!
Just another day with no progress..wuwu
 
谢谢chenke,还有pegusus,casso,seasky
我的问题解决了,虽然我还是有一些疑惑,呵呵

再次感谢大家!
 
谢谢chenke,还有pegusus,casso,seasky
我的问题解决了,虽然我还是有一些疑惑,呵呵

再次感谢大家!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部