I met the same problem with curl 7.21.6. When tring cancels the smtp protocol. Returning CURL_READFUNC_ABORT from the read callback stops the transfer, but curl_easy_perform does not return for the next 5+ minutes. He is probably waiting for tcp timeout.
To get around this, I store the socket used by curl (replace curl_opensocket_callback), and close this socket directly when necessary.
curl_socket_t storeCurlSocket(SOCKET *data, curlsocktype purpose, struct curl_sockaddr *addr) { SOCKET sock = socket(addr->family, addr->socktype, addr->protocol); *data = sock; return sock; } size_t abort_payload(void *ptr, size_t size, size_t nmemb, SOCKET *curl_socket) { SOCKET l_socket = INVALID_SOCKET; swap(l_socket, *curl_socket); if (l_socket != INVALID_SOCKET) { shutdown(l_socket, SD_BOTH); closesocket(l_socket); } return CURL_READFUNC_ABORT; } ...calling perform... SOCKET curlSocket; curet = curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, storeCurlSocket); curet = curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &curlSocket); curet = curl_easy_setopt(curl, CURLOPT_READFUNCTION, abort_payload); curet = curl_easy_setopt(curl, CURLOPT_READDATA, &curlSocket); curet = curl_easy_perform(curl); if (curet == CURLE_ABORTED_BY_CALLBACK) {
fantastory
source share