---
name: "curl_multi_socket"
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_socket"
---

# curl\_multi\_socket(3)

read/write available data

## NAME

curl\_multi\_socket - read/write available data

## SYNOPSIS

```
#include <curl/curl.h>
CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t sockfd,
                            int *running_handles);
```

## DESCRIPTION

This function is deprecated. Use *[curl\_multi\_socket\_action(3)](/curl_multi_socket_action/3.md)* instead with **ev\_bitmask** set to 0.

At return, the integer **running\_handles** points to contains the number of still running easy handles within the multi handle. When this number reaches zero, all transfers are complete/done. Note that when you call *[curl\_multi\_socket(3)](/curl_multi_socket/3.md)* on a specific socket and the counter decreases by one, it DOES NOT necessarily mean that this exact socket/transfer is the one that completed. Use *[curl\_multi\_info\_read(3)](/curl_multi_info_read/3.md)* to figure out which easy handle that completed.

The *[curl\_multi\_socket(3)](/curl_multi_socket/3.md)* functions inform the application about updates in the socket (file descriptor) status by doing none, one, or multiple calls to the socket callback function set with the *[CURLMOPT\_SOCKETFUNCTION(3)](/CURLMOPT_SOCKETFUNCTION/3.md)* option to *[curl\_multi\_setopt(3)](/curl_multi_setopt/3.md)*. They update the status with changes since the previous time the callback was called.

Get the timeout time by setting the *[CURLMOPT\_TIMERFUNCTION(3)](/CURLMOPT_TIMERFUNCTION/3.md)* option with *[curl\_multi\_setopt(3)](/curl_multi_setopt/3.md)*. Your application then gets called with information on how long to wait for socket actions at most before doing the timeout action: call the *[curl\_multi\_socket\_action(3)](/curl_multi_socket_action/3.md)* function with the **sockfd** argument set to CURL\_SOCKET\_TIMEOUT. You can also use the *[curl\_multi\_timeout(3)](/curl_multi_timeout/3.md)* function to poll the value at any given time, but for an event-based system using the callback is far better than relying on polling the timeout value.

## PROTOCOLS

This functionality affects all supported protocols

## EXAMPLE

```
int main(void)
{
  /* the event-library gets told when there activity on the socket 'fd',
     which we translate to a call to curl_multi_socket_action() */
  int running;
  int rc;
  int fd = 2;
  CURLM *multi = curl_multi_init();
  rc = curl_multi_socket(multi, fd, &running);
}
```

## DEPRECATED

*[curl\_multi\_socket(3)](/curl_multi_socket/3.md)* is deprecated, use *[curl\_multi\_socket\_action(3)](/curl_multi_socket_action/3.md)* instead.

## AVAILABILITY

Added in curl 7.15.4

## 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)*.

The return code is for the whole multi stack. Problems still might have occurred on individual transfers even when one of these functions return OK.

## SEE ALSO

[**curl\_multi\_cleanup**(3)](/curl_multi_cleanup/3.md), [**curl\_multi\_fdset**(3)](/curl_multi_fdset/3.md), [**curl\_multi\_info\_read**(3)](/curl_multi_info_read/3.md), [**curl\_multi\_init**(3)](/curl_multi_init/3.md), **the**hiperfifo.c**example**
