我遇到了与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
}
...
如何使用非阻塞curl_multi_perform HTTP://curl.haxx.se/libcurl/c/curl_multi_perform.html – 2014-02-24 19:31:54