P
paf
Unregistered / Unconfirmed
GUEST, unregistred user!
是在已建立了连接的情况下,当程序发送信息到服务器,但服务器没有返回信息,
用“recv”怎样在3秒内断开连接!因为 recv 没有读取到数据里,总是不能退出!
怎么办!
我不要用计时器完成3秒断开连接!有什么方法设置啊!
下面是代码是 Finger 连接对方135端口时的代码(连接135端口,只是作个例子)!因为连接135端口时不返回信息,搞到不会断开连接!
FingerSkt := socket(AF_INET, SOCK_STREAM, 0); //建立socket
if (FingerSkt = INVALID_SOCKET) then
begin
Fin_m1.Lines.Add('出错: 建立Socket出错!'#13#10);
FingerSt.Enabled := true;
exit;
end;
//3.连接主机
ZeroMemory(@addr, sizeof(addr));
addr.sin_family := AF_INET;
addr.sin_addr.s_addr := Host;
addr.sin_port := htons(135); //端口
Re := connect(FingerSkt, addr, sizeof(addr)); //连接主机 成功时返回“0”,否则返回 SOCKET_ERROR
if (Re <> 0) then
begin
Fin_m1.Lines.Add('出错: 不能连接主机的' + fin_port.text + '号端口!'#13#10);
FingerSt.Enabled := true;
exit;
end;
//4.发送信息
GetMem(BufSend, 1024);
ZeroMemory(BufSend, 1024);
Info := FinUse.Text + #10;
StrPCopy(BufSend, Info); //转为PChar
Re := send(FingerSkt, BufSend^, Length(BufSend), 0); //发达信息 成功发送时返回实际发送的字节数,否则返回 SOCKET_ERROR
if (Re = SOCKET_ERROR) then //正常的TSocket的范围为 1~SOCKET_ERROR-1
begin
Fin_m1.Lines.Add('内容不能发送!'#13#10);
FingerSt.Enabled := true;
exit;
end;
FingerSt.Caption := '停止';
//5.读取主机返回信息
GetMem(BufRecv, 1024);
//------------ 重复执行下面代码用于读取主机返回信息 --------
repeat //循环
ZeroMemory(bufRecv, 1024);
re := recv(FingerSkt, BufRecv^, 1024, 0); //接收数据 (就是这里,要怎样才能在没有数据到来的3秒后断开了?)
if re =-1 then begin
Fin_m1.Lines.Add('[用户中断]');
break;
end;
Info := StrPas(bufRecv); //转为 string 类型
Fin_m1.Lines.Add(Info);
until re = 0; //如果re=0为真时就不在执行循环
............
用“recv”怎样在3秒内断开连接!因为 recv 没有读取到数据里,总是不能退出!
怎么办!
我不要用计时器完成3秒断开连接!有什么方法设置啊!
下面是代码是 Finger 连接对方135端口时的代码(连接135端口,只是作个例子)!因为连接135端口时不返回信息,搞到不会断开连接!
FingerSkt := socket(AF_INET, SOCK_STREAM, 0); //建立socket
if (FingerSkt = INVALID_SOCKET) then
begin
Fin_m1.Lines.Add('出错: 建立Socket出错!'#13#10);
FingerSt.Enabled := true;
exit;
end;
//3.连接主机
ZeroMemory(@addr, sizeof(addr));
addr.sin_family := AF_INET;
addr.sin_addr.s_addr := Host;
addr.sin_port := htons(135); //端口
Re := connect(FingerSkt, addr, sizeof(addr)); //连接主机 成功时返回“0”,否则返回 SOCKET_ERROR
if (Re <> 0) then
begin
Fin_m1.Lines.Add('出错: 不能连接主机的' + fin_port.text + '号端口!'#13#10);
FingerSt.Enabled := true;
exit;
end;
//4.发送信息
GetMem(BufSend, 1024);
ZeroMemory(BufSend, 1024);
Info := FinUse.Text + #10;
StrPCopy(BufSend, Info); //转为PChar
Re := send(FingerSkt, BufSend^, Length(BufSend), 0); //发达信息 成功发送时返回实际发送的字节数,否则返回 SOCKET_ERROR
if (Re = SOCKET_ERROR) then //正常的TSocket的范围为 1~SOCKET_ERROR-1
begin
Fin_m1.Lines.Add('内容不能发送!'#13#10);
FingerSt.Enabled := true;
exit;
end;
FingerSt.Caption := '停止';
//5.读取主机返回信息
GetMem(BufRecv, 1024);
//------------ 重复执行下面代码用于读取主机返回信息 --------
repeat //循环
ZeroMemory(bufRecv, 1024);
re := recv(FingerSkt, BufRecv^, 1024, 0); //接收数据 (就是这里,要怎样才能在没有数据到来的3秒后断开了?)
if re =-1 then begin
Fin_m1.Lines.Add('[用户中断]');
break;
end;
Info := StrPas(bufRecv); //转为 string 类型
Fin_m1.Lines.Add(Info);
until re = 0; //如果re=0为真时就不在执行循环
............