我正在尝试在C中实现一个客户端,希望将其绑定到固定端口,并在curl查询中使用获取的fd。 我希望这个fd不会被关闭,但要重复使用它直到进程生命周期,以便没有其他进程可以使用该端口,尽管连接可能会关闭。
由于该端口不应被任何其他进程使用,因此我没有使用CURLOPT_LOCALPORT选项。
虽然https://curl.haxx.se/libcurl/c/libcurl.html找到了合适的curl选项但找到了CURLOPT_OPENSOCKETFUNCTION和CURLOPT_SOCKOPTFUNCTION
但是当在服务器端检查客户端端口时,没有使用固定端口进行查询。
以下是我来之前尝试过的代码块。
//create socket
clientFd = socket(ipType, SOCK_STREAM, 0);
//bind client socket
struct sockaddr_in clientAddr;
clientAddr.sin_family = ipType;
clientAddr.sin_addr.s_addr = inet_addr(clientIP);
clientAddr.sin_port = clientPort;
bind(clientFd, (struct sockaddr *)&clientAddr, sizeof(clientAddr))
//Using CURLOPT_OPENSOCKETFUNCTION
//Based on understanding, we need to make a connection to the server and return //back the fd
static curl_socket_t curl_opensocket(void *myFD, curlsocktype connType, struct curl_sockaddr *peerAddr) // connect to server using client FD
{
struct sockaddr_in *addr_in = (struct sockaddr_in *)(&(peerAddr->addr));
remAddr = malloc(INET_ADDRSTRLEN);
remPort = (u_short)addr_in->sin_port;
inet_ntop(AF_INET, &(addr_in->sin_addr), remAddr, INET_ADDRSTRLEN);
sockfd = *(curl_socket_t *)myFD;
connect(sockfd, (struct sockaddr *)(&(peerAddr->addr)), sizeof(peerAddr->addr);
return sockfd;
}
curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, curl_opensocket);
curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &clientFD);
使用上面的选项设置查询,选择不同的客户端端口并且fd正在关闭
//Using CURLOPT_SOCKOPTFUNCTION
//Based on understanding, this gets called after socket creation and before connect
static int sockopt_callback(void *clientp, curl_socket_t curlfd, curlsocktype purpose)
{
(void)clientp;
(void)curlfd;
(void)purpose;
return CURLSOCKTYPE_IPCXN;
}
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &clientFd);
此处查询也是使用不同的客户端端口,但clientFd未关闭。
请帮帮我,在卷曲查询中使用绑定的fd,可以终止连接,但不能终止fd,并且在后续连接中使用fd时,会选择固定端口。
答案 0 :(得分:0)
在您的“CURLOPT_SOCKOPTFUNCTION”中,您应该返回 CURL_SOCKOPT_ALREADY_CONNECTED 而不是 CURLSOCKTYPE_IPCXN,因为您的套接字已经连接。
检查此处给出的示例代码 https://curl.se/libcurl/c/CURLOPT_OPENSOCKETFUNCTION.html