Socket.ReceiveBuf()总等于 -1 怎么办?谢谢!(100分)

  • 主题发起人 主题发起人 amwtdkj
  • 开始时间 开始时间
A

amwtdkj

Unregistered / Unconfirmed
GUEST, unregistred user!
GetMem(bufRecv,1050);//2000 must >iBYTESEND
iRecvLength:=Socket.ReceiveBuf(bufRecv^,1050);//iRecvLength=-1为什么?
fsRecv.WriteBuffer(bufRecv^,iRecvLength);//出错!
Client向server已发了1036个字节!//是用cap_test发现的!
很很委屈呀!
 
自己先UUUUUPPPPP一下!
 
使用SysErrorMessage(WSAGetLastError)看看是什么错误信息。
 
var
iLength: Integer;
...
begin
//取数据前一定要先把长度取出来,保存在一个变量中。
iLength := Socket.ReceiveLength;
GetMem(bufRecv, iLength);
try
Socket.ReceiveBuf(bufRecv^, iLength); //
sTemp := StrPas(PChar(bufRecv));
...
 
"Write socket error"
 
iRecvLength:=Socket.ReceiveBuf(bufRecv^,1050);
这行是不是应该为:
iRecvLength:=Socket.ReceiveBuf(bufRecv[0],1050);
 
edit1.text := Socket.ReceiveLength;//发现edit1.text:=0;
 
前面不能有Socket.ReceiveText或Socket.ReceiveBuf动作,因为执行这两个方法都会清空接收缓冲区,也就是说在执行这两个方法后Socket.ReceiveLength将会返回0,ReceiveBuf方法也将取不到正确的数据。
 
建议看一下Delphi自带的Socket相关Demo...
 
i:=recv(FSocket, bufRecv^, Count, 0);
showMessage(inttostr(i));看看结果如何
 
前面不能有Socket.ReceiveText或Socket.ReceiveBuf动作,因为执行这两个方法都会清空接收缓冲区,也就是说在执行这两个方法后Socket.ReceiveLength将会返回0,ReceiveBuf方法也将取不到正确的数据。


::: 我是在前面收发过text ! 怎么才能收到!正确的数据?
小弟刚开始学delphi以后还请各位多多指教!!!
 
Delphi.socket.demo程序都是关于收发text的!
我是想作文件收发(同步)!我参照的是下面的example:


Const
MP_QUERY ='1';
MP_REFUSE ='2';
MP_ACCEPT ='3';
MP_NEXTWILLBEDATA='4';
MP_DATA ='5';
MP_ABORT ='6';
MP_OVER ='7';
MP_CHAT ='8';
协议简介:
首先由Client发送MP_QUERY,Server接受到后发送MP_ACCEPT或MP_FEFUESE;
Client接受到MP_ACCEPT发送MP_FILEPROPERTY,Server接受到后发送MP_NEXTWILLBEDATA;
Client接受到发送MP_NEXTWILLBEDATA,Server接受到后发送MP_DATA;
Client接受到MP_DATA,发送数据,Server接受数据,并发送MP_NEXTWILLBEDATA;
循环,直到Client发送MP_OVER;
中间可以互相发送MP_CHAT+String;
Server程序:
放上以下控件:SaveDialog1,btnStartServer,
ss,(TServerSocket)
btnStartServer.OnClick(Sender:TObject);
begin
ss.Port:=2000;
ss.Open;
end;
ss.OnClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
sTemp:string;
bufRecv:Pointer;
iRecvLength:integer;
begin
if bReadText then
begin
sTemp:=Socket.ReceiveText;
case sTemp[1] of
=====...................
 
wuchunhua::::
你说的话不太懂呀!不好意思!
 
iRecvLength:=Socket.ReceiveBuf(bufRecv[0],1050);
无法编译通过!
 
急急!呀呀
各们位老大帮忙呀!
 
iRecvLength:=Socket.ReceiveBuf(bufRecv^,1050);//iRecvLength=-1为什么?
if iRecvLength=-1 then
showmessage(inttostr(WSAGetLastError)); //先告诉我这个值是多少
fsRecv.WriteBuffer(bufRecv^,iRecvLength);//出错!
 
showmessage(inttostr(WSAGetLastError));
无法通过!
我用的是:showmessage(inttostr(GetLastError));
得到 10035 !!!
 
然后是:project project1.exe raised exception class ewriterror with message 'stream write error'.process stopped.
 
iRecvLength:=Socket.ReceiveBuf(bufRecv^,1050);//iRecvLength=-1为什么?
说明通讯错误!检查端口有没有设置正确先
 
10035啊,那就是说数据还没有到达,你确认发送方数据已经发送?

然后的错误是接下来的fsRecv.WriteBuffer(bufRecv^,iRecvLength);这句引起的,因为iRecvLength=-1,当然会出错了
 
后退
顶部