急救: Winsock 中用recv读取数据,当没有数据可读时会没有响应。(版主,请帮我删除,已经自已搞定)) (100分)

  • 主题发起人 主题发起人 HeXiang Lee
  • 开始时间 开始时间
H

HeXiang Lee

Unregistered / Unconfirmed
GUEST, unregistred user!
正在做一个Winsock通讯的程序。
用到了revc函数,不知是为什么,当没有数据可读时revc没有响应,一直在运行,不返回。
程序没有响应。
getMem(RecvBuff,1024);
repeat
zeroMemory(RecvBuff,1024);
re:=recv(socket1,RecvBuff^,1024,0); //在这里,如果没有数据可读的话,程序不会往下执行.
info:=strPas(RecvBuff);
memo1.Lines.Add(info);
until re=0;
freemem(RecvBuff);


在家最好能在回复中留下Email,我只有12:00-14:00可以上网.
我的email: lhxsz@21cn.com
 
很正常呀,这有什么好奇怪的了?
你是用猪塞式呀,最好放到现成里去调用这个函数,或者用消息模式
 
SOCKET_ERROR常量为-1
应该校验re是否为-1
 
他用的是猪塞式,哪个Recv函数不返回,你如何检查值?晕![:(]
 
to:张无忌
我对Socket不熟呀,告诉我怎么做好吗?
以下是我的过程的代码,该怎么改呀?
谢谢!


var
info:string;
SendBuff,RecvBuff:pchar;
socket1:TSocket;
addr:TSockAddr;
Re:Integer;
begin
socket1:=Socket(AF_INET,Sock_STREAM,0);
socket(
if (socket1=INVALID_SOCKET) then
begin
Memo1.Lines.Add('错误:建立Socket失败');
exit;
end;
ZeroMemory(@addr,sizeof(Addr));
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr :=inet_addr(pchar(edit1.Text ));
addr.sin_port :=htons(SpinEdit1.Value) ;

re:=connect(socket1,addr,sizeof(addr));
if re<>0 then
begin
memo1.Lines.Add('连接失败!');
exit;
end;
GetMem(SendBuff,100);
ZeroMemory(SendBuff,100);
strpcopy(SendBuff,GendCommand(C05,1));
Re:=Send(Socket1,SendBuff^,Length(SendBuff),0);

if re=Socket_Error then
begin
memo1.Lines.Add('发送数据失败!');
exit;
end;
getMem(RecvBuff,1024);
// repeat
zeroMemory(RecvBuff,1024);
re:=recv(socket1,RecvBuff^,1024,0);
info:=strPas(RecvBuff);
if info=GendCommand(R05,1) then
memo1.Lines.Add('通讯成功!');
memo1.Lines.Add(info);
// until re=0;
memo1.Lines.Add('结束!');
freemem(sendBuff);
freemem(RecvBuff);
closeSocket(socket1);
if Memo1.Lines.Count >3 then
Memo1.Lines.Delete(0);

 
你开始的时候干脆用控件得了,TClientSocket和TIdTcpClient都可以用,
 
to :张无忌
留下Email,我只有12:00-14:00可以上网.
我的email: lhxsz@21cn.com
 
呵呵~同意张无忌,不熟的时候用控件得了。
 
大家幫幫忙好嗎?實在太急了。
讀了第一次再循環讀第二次時就沒有響應了。
 
这个不是一会能给你讲清楚的,你用控件做不就简单多了,?
 

用控件是簡單﹐但是不能達到我要的效果。我以上的程序一定要一行一行的執行下來。
幫我看看﹐怎么改一下﹐只要能用就可以了﹐我看不懂也沒有關系﹐以后有空了再去細看
只要現在能完成任務。謝謝!
 
那你用TIdClient他就是顺寻执行的,
 
应该是TIdTcpClient,
其实用TClientSocket一样做,设置几个标志就可以了
 
你去看看线程的书,把接收数据的方法放在线程中执行,不过建议你按张无忌说的用indy
控件去做,加上IdAntiFreeze就不会出现死锁的情况。
 
高手不能帮助解决问题,
DFW上还有其他的高手吗?快点呀。
 
怎么解决,贴出来看看,我给你100分
 
搞不明白,为什么楼主要偶到这里来拿分?
 
问题没有在这里解决呀,当然不可以浪费分了.
给你分,接着.
 
HeXiang Lee请问如何解决的?我也遇到这问题呀?
 

Similar threads

后退
顶部