curl\_multi\_assign(3) Library Functions Manual curl\_multi\_assign(3)

# [NAME](#NAME)

curl\_multi\_assign - set data to associate with an internal socket

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,


                            void *sockptr);
```

# [DESCRIPTION](#DESCRIPTION)

This function creates an association in the multi handle between the given socket and a private pointer of the application. This is designed for [*curl\_multi\_socket\_action(3)*](/man/os/curl/curl_multi_socket_action.3) uses.

When set, the *sockptr* pointer is passed to all future socket callbacks for the specific *sockfd* socket, until the socket stops being monitored (CURL\_POLL\_REMOVE is sent to the [*CURLMOPT\_SOCKETFUNCTION(3)*](/man/os/curl/CURLMOPT_SOCKETFUNCTION.3) callback).

If the given *sockfd* is not already in use by libcurl, this function returns an error.

libcurl only keeps one single pointer associated with a socket, so calling this function several times for the same socket makes the last set pointer get used.

It is acceptable to call this function from your multi callback functions.

# [PROTOCOLS](#PROTOCOLS)

This functionality affects all supported protocols

# [EXAMPLE](#EXAMPLE)

```
int main(void)
{


  CURLM *multi = curl_multi_init();


  int private_data = 123;


  curl_socket_t fd = 0; /* file descriptor to associate our data with */


  /* make our struct pointer associated with socket fd */


  CURLMcode mresult = curl_multi_assign(multi, fd, &private_data);


  if(mresult)


    printf("error: %s\n", curl_multi_strerror(mresult));
}
```

# [TYPICAL USAGE](#TYPICAL_USAGE)

In a typical application you allocate a struct or at least use some kind of semi-dynamic data for each socket that we must wait for action on when using the [*curl\_multi\_socket\_action(3)*](/man/os/curl/curl_multi_socket_action.3) approach.

When our socket-callback gets called by libcurl and we get to know about yet another socket to wait for, we can use [*curl\_multi\_assign(3)*](/man/os/curl/curl_multi_assign.3) to point out the particular data so that when we get updates about this same socket again, we do not have to find the struct associated with this socket by ourselves.

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.15.5

# [RETURN VALUE](#RETURN_VALUE)

This function returns a CURLMcode indicating success or error.

CURLM\_OK (0) means everything was OK, non-zero means an error occurred, see [*libcurl-errors(3)*](/man/os/curl/libcurl-errors.3).

# [SEE ALSO](#SEE_ALSO)

[**CURLMOPT\_SOCKETFUNCTION**(3)](/man/os/curl/CURLMOPT_SOCKETFUNCTION.3), [**curl\_multi\_setopt**(3)](/man/os/curl/curl_multi_setopt.3), [**curl\_multi\_socket\_action**(3)](/man/os/curl/curl_multi_socket_action.3)

2026-10-31 libcurl

---

Document: curl_multi_assign(3) from curl 8.23.0-r3 (Chainguard OS)
Source: https://github.com/curl/curl.git
