当程序向一个服务器的端口发送了信息,如果对方不返回信息,用“recv”怎样在3秒内断开连接啊!(100分)

  • 主题发起人 主题发起人 paf
  • 开始时间 开始时间
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为真时就不在执行循环

............
 
用WSARecv啊。
 
可以给个例子吗?
 
var
Timeout: Integer;

FingerSkt := socket(AF_INET, SOCK_STREAM, 0); //建立socket

timeout := 3000;
setsockopt(FingerSkt , SOL_SOCKET, SO_SNDTIMEO, PChar(@timeout), sizeof(timeout));
setsockopt(FingerSkt, SOL_SOCKET, SO_RCVTIMEO, PChar(@timeout), sizeof(timeout));
 
没有收到东东的时候,recv的返回值应该是0,即是等待超时。
 
setsockopt(FingerSkt , SOL_SOCKET, SO_SNDTIMEO, PChar(@timeout), sizeof(timeout));
setsockopt(FingerSkt, SOL_SOCKET, SO_RCVTIMEO, PChar(@timeout), sizeof(timeout));

可以设置接收和发送超时,哪要怎样设置连接超时啊,
就是当某IP是没的打开端口的时候,程序总是要等10来秒才退出!

要怎样设置连接超时啊!
 
N多人问过,不过都是失望而归,估计你也一样
 
真的好想知道!
 
连接超时是70秒(系统默认)
如果想设置连接超时可以这样
1。把套接字用select/WSAEventSelect FD_CONNECT
2。select是自己返回/WSAEventSelect用WSAWaitFor******超时设置成你想要的值,然后在这个函数返回以后通过判断返回值就可以知道是连接成功还是失败或者是超时。
 
补充,select是设置写超时
 
可以给个例子吗?
 
我该说的都说了,如果你会用一点Winsock API就很容易按我上面说的写出设置超时的代码出来,其实用TServerSocket也可以实现连接超时设置,只是代码有点蹩脚而已.
 
后退
顶部