2015-04-28 55 views
0

我寫一個小的網絡工具,在某個地方在我的代碼,我有以下行:如何設置connect()的超時時間以及如何測量它?

if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0) 
    syserr("connect"); 

我有一個關於超時兩個問題:

  1. 如何設置超時爲connect()使用Linux API?
  2. 如果我想自己測量超時,那麼執行此操作的正確方法是什麼?

回答

1

爲SIGALARM註冊信號處理程序。在連接返回之前調用連接之前設置警報並清除警報,如果你點擊信號處理程序,那麼它是連接超時。

0

設置套接字非阻塞,發出connect(),然後使用select()poll()epoll()以超時,選擇可寫。

我不知道'你測量超時'是什麼意思。

1

使用非阻塞連接並使用select或poll或epoll超時。這是示例。

int fd = socket(PF_INET,SOCK_STREAM,0); 
int flags = fcntl(fd,F_GETFL); 
if (flags >= 0) 
    flags = fcntl(fd, F_SETFL, flags | O_NONBLOCK); 
int n = connect(fd, (struct sockaddr*)&addr, sizeof addr); 
if(n < 0) 
{ 
    if(errno != EINPROGRESS && errno != EWOULDBLOCK) 
     return 1; 

    struct timeval tv; 
    tv.tv_sec = 10; 
    tv.tv_usec = 0; 
    fd_set wset; 
    FD_ZERO(&wset); 
    FD_SET(fd,&wset); 
    n = select(fd+1,NULL,&wset,NULL,&tv); 
    if(n < 0) 
    { 
     close(fd); 
     return 1; 
    } 
    else if (0 == n) 
    { // timeout 
     cerr<< "Timeout." << endl; 
     close(fd); 
     return 1; 
    } 
    else 
    { // connect success 
     cerr << "Connectd." <<endl; 
    } 
}