请教有经验大虾,---Socket编程的问题---,在线等待,重重给分,想要多少,就有多少!急急急!!!(100分)

  • 主题发起人 主题发起人 wwq1208
  • 开始时间 开始时间
W

wwq1208

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题是:

在使用TserverSocket和TclientSocket进行通讯时,在服务器端我发送的信息是:
array of byte 类型的信息,

可是我遇到了这样一个问题,在我发送信息之前,我取得信息的长度是127,可是到了客户端,信息读取的长度是23,我实在是搞不清楚这是为什么?

我的客户端和服务器端是做在一起的,只是先想测试一下,然后再分开,不知哪位大虾可否指点一二!!!!????

分 我会多给,我不会吝啬的!!!! 急急急!!!!
 
TclientSocket发请求,TserverSocket应答
连接以后通过SOCK套接字用SEND、RECV发和收
 
在服务器端,我用的是Send() API函数,客户端用的是
len:=socket.ReceiveLength;
setlength(buf,len);
Socket.ReceiveBuf(Buf[0],len);

可是得出来的len的长度,根本就不对!!1
 
流协议本来就是如此,你读的缓冲多大,他给你的最大就这么大,,
还有,可能你发送的缓冲区指针错了,这个很容易出问题
 
你用sendbuf发送试一试,肯定没问题
 
楼上的兄弟,那读的缓冲区那怎么设置啊?

 
TCP的缓冲默认是8K,同时SendBuf你要调用正确,在本机上测试,你说的问题很难
出现,在Internet上有可能出现,不过几率太小了,TCP是尽可能的发送大的包,
会把小包组合成大包发送,所以我估计是你的函数使用有问题
 
读写缓冲都是8K,这个可以修改(setsockopt),一般来说没有必要修改,除了特殊应用,
比如Telnet,FTP服务器什么的
 
没有收全你继续收,用一个循环,收完为止,我也碰到过这种情况,服务器端发出来的数据客户端一下子收不全
 
不过我总觉的奇怪,你服务器和客户部分在一个EXE里,应该不会有楼上说的问题
本机上TCP的传输是特殊的回路进行的,
 
“张无忌”兄,

我在服务器端使用的是:Send() API函数,是不是这个函数使用的有问题,那为什么,有的信息又可以正确传到
客户端呢?

还有,如果使用Sendbuf(),那又怎么样使报文信息发送到具体的某个客户端???
 
的确,我先是把服务器端和客户端聚在一个EXE中,当能实现功能后,再生成客户端。
 
来过的兄弟们,可以到CSDN论坛中去回答这个问题,我在那里分数比这里更多,我现在有5000多分,我会多给的,不会吝啬的
 
famu 兄,你说的用“没有收全你继续收,用一个循环,收完为止,我也碰到过这种情况,
服务器端发出来的数据客户端一下子收不全”

这怎么实现去了???

能把代码贴出来看一下吗??
 
在本机上调试一般是不存在接受不完的问题,除非你接受提供的缓冲区不够,
在远程确实有这个问题,你在下一次OnRead事件里接受剩余的部分就OK了,至
于如何做,自己考虑,办法很多,一般都是用指针来移动位置
 
看看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1811274 的有关非阻塞模式的讨论

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var
strCMD: string;
begin
Flag := True; //判断是否为欢迎标志
strCMD:= '';
Socket.SendText(Demo);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Hour, Min, Sec, MSec: Word;
begin
if Flag then
begin
Memo.Lines.Add(Socket.ReceiveText);
Flag := False;
end
else begin
Socket.ReceiveText;
dtEnd := Now;
EndTimeEdt.Text := TimeToStr(dtEnd);

dtElp := dtEnd - dtStart;
DecodeTime(dtElp, Hour, Min, Sec, MSec);

ElpTimeEdt.Text := IntToStr(Hour * 60 + Min) + ':' +
IntToStr(Sec) + '.' + IntToStr(MSec);
end;
end;


如果只是单纯的接收,代码如下:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo.Lines.Add(Socket.ReceiveText);
end;

 
如果我没有猜错的话,肯定是你再给数组付值的时候,出错,我就遇到这样的情况
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
clientsocket1.socket.ReceiveBuf(yous'array of byte));
end;
 
接受答案了.
 
后退
顶部