---
name: "curl_multi_assign"
section: "3"
platform: "linux"
package: "curl"
version: "8.23.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/curl_multi_assign"
---

# curl\_multi\_assign(3)

set data to associate with an internal socket

## NAME

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

## SYNOPSIS

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

## 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)](/curl_multi_socket_action/3.md)* 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)](/CURLMOPT_SOCKETFUNCTION/3.md)* 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

This functionality affects all supported protocols

## 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

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)](/curl_multi_socket_action/3.md)* 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)](/curl_multi_assign/3.md)* 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

Added in curl 7.15.5

## 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)](/libcurl-errors/3.md)*.

## SEE ALSO

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