使用绑定的客户端套接字进行卷曲查询

时间:2018-03-16 06:45:30

标签: c sockets curl

我正在尝试在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时,会选择固定端口。

1 个答案:

答案 0 :(得分:0)

在您的“CURLOPT_SOCKOPTFUNCTION”中,您应该返回 CURL_SOCKOPT_ALREADY_CONNECTED 而不是 CURLSOCKTYPE_IPCXN,因为您的套接字已经连接。

检查此处给出的示例代码 https://curl.se/libcurl/c/CURLOPT_OPENSOCKETFUNCTION.html