我在 curl 7.21.6 上遇到了同样的问题。当试图中止 smtp 协议时。从读取回调返回 CURL_READFUNC_ABORT 会停止传输,但 curl_easy_perform 在接下来的 5 分钟内不会返回。可能它等待 tcp 超时。
为了四处走动,我存储了 curl 使用的套接字(替换 curl_opensocket_callback),并在需要时直接关闭此套接字。
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) {
//expected abort
}
...