Recvfrom 返回值的问题(200分)

  • 主题发起人 主题发起人 远帆
  • 开始时间 开始时间

远帆

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么下面这段代码将注释掉的一句一加入就运行不正常?
repeat
FillMemory(@BufRecv, 1025, 0);
Re := recvfrom(Skt1, BufRecv, 1024, 0, Addr, AddLen);
LoopStop := (Re = SOCKET_ERROR);
ShowMessage('1:' + IntToStr(Re));

if not (LoopStop) then
begin
Memo1.Lines.Add('data receive from: ' + inet_ntoa(Addr.sin_addr));

for n := 0 to Re - 1 do
begin
if BufRecv[n] = 0 then
Memo1.Lines.Text := Memo1.Lines.Text + (char(94)) //char(^)
else
Memo1.Lines.Text := Memo1.Lines.Text + (char(BufRecv[n]));
end;

Memo1.Lines.Text := Memo1.Lines.Text + #13;
Memo1.Lines.Text := Memo1.Lines.Text + #10;
end;
// ShowMessage('2:' + IntToStr(Re)); <--this
until LoopStop;

 
错误应该在这里
procedure TForm1.Button1Click(Sender: TObject);
var
NowStr: String;
ifEque: Boolean;
begin
ifEque := (NowStr = Edit1.Text);
ShowMessage(NowStr);
//比较上下两句话
NowStr := Edit1.Text;
ShowMessage(NowStr);
end;
 
:< what is Error Info
 
不对!我的想法不对,不是这里出的Bug[:(]
 
哦?我试试,
没有错误提示。没有那一句时re的值为收到的字节数。有那一句时,re=-1(SOCKET_ERROR)
 
各位大侠,帮帮忙啊!
 
ShowMessage('1:' + IntToStr(Re));
// ShowMessage('2:' + IntToStr(Re)); <--this
有上面的,没有下面的还正常?如果真是,那是疑难杂症[:D]我没辙,呵呵。
 
是啊,真的是很奇怪。我原先在循环条件中用
until re=SOCKET_ERROR;
结果就是不能运行,结果弄个中间变量LoopStop就一点问题都没有,
难道winsock api还偷偷改了re的值?
 
>>难道winsock api还偷偷改了re的值?
不可能!
估计原因应该是延时或者什么同步的问题,偶不清楚这个。
 
要不要整个弄出来,你们好调试调试?
 
高手帮忙,分不够,我加加加:)
 
FillMemory(@BufRecv, 1025, 0);改为
FillMemory(@BufRecv, 1025, #0);//用#0才是清空缓冲区。



 
To shangshang:
我的没有错,不信你试试!
 
也许使用线程才是正宗的方法(奇怪呀我用的是阻塞的方式这样也应该是可以的呀!)
谢谢各位。
 
后退
顶部