Ejemplo n.º 1
0
static void
tcpkeepalive(struct SessionHandle *data,
             curl_socket_t sockfd)
{
  int optval = data->set.tcp_keepalive?1:0;

  /* only set IDLE and INTVL if setting KEEPALIVE is successful */
  if(setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE,
        (void *)&optval, sizeof(optval)) < 0) {
    infof(data, "Failed to set SO_KEEPALIVE on fd %d\n", sockfd);
  }
  else {
#ifdef TCP_KEEPIDLE
    optval = curlx_sltosi(data->set.tcp_keepidle);
    KEEPALIVE_FACTOR(optval);
    if(setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE,
          (void *)&optval, sizeof(optval)) < 0) {
      infof(data, "Failed to set TCP_KEEPIDLE on fd %d\n", sockfd);
    }
#endif
#ifdef TCP_KEEPINTVL
    optval = curlx_sltosi(data->set.tcp_keepintvl);
    KEEPALIVE_FACTOR(optval);
    if(setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL,
          (void *)&optval, sizeof(optval)) < 0) {
      infof(data, "Failed to set TCP_KEEPINTVL on fd %d\n", sockfd);
    }
#endif
  }
}
Ejemplo n.º 2
0
static void
tcpkeepalive(struct Curl_easy *data,
             curl_socket_t sockfd)
{
    int optval = data->set.tcp_keepalive?1:0;

    /* only set IDLE and INTVL if setting KEEPALIVE is successful */
    if(setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE,
                  (void *)&optval, sizeof(optval)) < 0) {
        infof(data, "Failed to set SO_KEEPALIVE on fd %d\n", sockfd);
    }
    else {
#if defined(SIO_KEEPALIVE_VALS)
        struct tcp_keepalive vals;
        DWORD dummy;
        vals.onoff = 1;
        optval = curlx_sltosi(data->set.tcp_keepidle);
        KEEPALIVE_FACTOR(optval);
        vals.keepalivetime = optval;
        optval = curlx_sltosi(data->set.tcp_keepintvl);
        KEEPALIVE_FACTOR(optval);
        vals.keepaliveinterval = optval;
        if(WSAIoctl(sockfd, SIO_KEEPALIVE_VALS, (LPVOID) &vals, sizeof(vals),
                    NULL, 0, &dummy, NULL, NULL) != 0) {
            infof(data, "Failed to set SIO_KEEPALIVE_VALS on fd %d: %d\n",
                  (int)sockfd, WSAGetLastError());
        }
#elif defined(CURL_WINDOWS_APP)
        (void)majorVersion;
        detectOsState = DETECT_OS_VISTA_OR_LATER;
#else
#ifdef TCP_KEEPIDLE
        optval = curlx_sltosi(data->set.tcp_keepidle);
        KEEPALIVE_FACTOR(optval);
        if(setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE,
                      (void *)&optval, sizeof(optval)) < 0) {
            infof(data, "Failed to set TCP_KEEPIDLE on fd %d\n", sockfd);
        }
#endif
#ifdef TCP_KEEPINTVL
        optval = curlx_sltosi(data->set.tcp_keepintvl);
        KEEPALIVE_FACTOR(optval);
        if(setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL,
                      (void *)&optval, sizeof(optval)) < 0) {
            infof(data, "Failed to set TCP_KEEPINTVL on fd %d\n", sockfd);
        }
#endif
#ifdef TCP_KEEPALIVE
        /* Mac OS X style */
        optval = curlx_sltosi(data->set.tcp_keepidle);
        KEEPALIVE_FACTOR(optval);
        if(setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE,
                      (void *)&optval, sizeof(optval)) < 0) {
            infof(data, "Failed to set TCP_KEEPALIVE on fd %d\n", sockfd);
        }
#endif
#endif
    }
}