1*6236dae4SAndroid Build Coastguard Worker--- 2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 4*6236dae4SAndroid Build Coastguard WorkerTitle: curl_ws_send 5*6236dae4SAndroid Build Coastguard WorkerSection: 3 6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl 7*6236dae4SAndroid Build Coastguard WorkerSee-also: 8*6236dae4SAndroid Build Coastguard Worker - curl_easy_getinfo (3) 9*6236dae4SAndroid Build Coastguard Worker - curl_easy_perform (3) 10*6236dae4SAndroid Build Coastguard Worker - curl_easy_setopt (3) 11*6236dae4SAndroid Build Coastguard Worker - curl_ws_recv (3) 12*6236dae4SAndroid Build Coastguard Worker - libcurl-ws (3) 13*6236dae4SAndroid Build Coastguard WorkerProtocol: 14*6236dae4SAndroid Build Coastguard Worker - WS 15*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.86.0 16*6236dae4SAndroid Build Coastguard Worker--- 17*6236dae4SAndroid Build Coastguard Worker 18*6236dae4SAndroid Build Coastguard Worker# NAME 19*6236dae4SAndroid Build Coastguard Worker 20*6236dae4SAndroid Build Coastguard Workercurl_ws_send - send WebSocket data 21*6236dae4SAndroid Build Coastguard Worker 22*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS 23*6236dae4SAndroid Build Coastguard Worker 24*6236dae4SAndroid Build Coastguard Worker~~~c 25*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h> 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_ws_send(CURL *curl, const void *buffer, size_t buflen, 28*6236dae4SAndroid Build Coastguard Worker size_t *sent, curl_off_t fragsize, 29*6236dae4SAndroid Build Coastguard Worker unsigned int flags); 30*6236dae4SAndroid Build Coastguard Worker~~~ 31*6236dae4SAndroid Build Coastguard Worker 32*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION 33*6236dae4SAndroid Build Coastguard Worker 34*6236dae4SAndroid Build Coastguard WorkerThis function call is EXPERIMENTAL. 35*6236dae4SAndroid Build Coastguard Worker 36*6236dae4SAndroid Build Coastguard WorkerSend the specific message fragment over an established WebSocket 37*6236dae4SAndroid Build Coastguard Workerconnection. The *buffer* holds the data to send and it is *buflen* 38*6236dae4SAndroid Build Coastguard Workernumber of payload bytes in that memory area. 39*6236dae4SAndroid Build Coastguard Worker 40*6236dae4SAndroid Build Coastguard Worker*sent* is returned as the number of payload bytes actually sent. 41*6236dae4SAndroid Build Coastguard Worker 42*6236dae4SAndroid Build Coastguard WorkerTo send a (huge) fragment using multiple calls with partial content per 43*6236dae4SAndroid Build Coastguard Workerinvoke, set the *CURLWS_OFFSET* bit and the *fragsize* argument as the 44*6236dae4SAndroid Build Coastguard Workertotal expected size for the first part, then set the *CURLWS_OFFSET* with 45*6236dae4SAndroid Build Coastguard Workera zero *fragsize* for the following parts. 46*6236dae4SAndroid Build Coastguard Worker 47*6236dae4SAndroid Build Coastguard WorkerIf not sending a partial fragment or if this is raw mode, *fragsize* 48*6236dae4SAndroid Build Coastguard Workershould be set to zero. 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard WorkerIf **CURLWS_RAW_MODE** is enabled in CURLOPT_WS_OPTIONS(3), the 51*6236dae4SAndroid Build Coastguard Worker**flags** argument should be set to 0. 52*6236dae4SAndroid Build Coastguard Worker 53*6236dae4SAndroid Build Coastguard WorkerTo send a message consisting of multiple frames, set the *CURLWS_CONT* bit 54*6236dae4SAndroid Build Coastguard Workerin all frames except the final one. 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard WorkerWarning: while it is possible to invoke this function from a callback, 57*6236dae4SAndroid Build Coastguard Workersuch a call is blocking in this situation, e.g. only returns after all data 58*6236dae4SAndroid Build Coastguard Workerhas been sent or an error is encountered. 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard Worker# FLAGS 61*6236dae4SAndroid Build Coastguard Worker 62*6236dae4SAndroid Build Coastguard Worker## CURLWS_TEXT 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard WorkerThe buffer contains text data. Note that this makes a difference to WebSocket 65*6236dae4SAndroid Build Coastguard Workerbut libcurl itself does not make any verification of the content or 66*6236dae4SAndroid Build Coastguard Workerprecautions that you actually send valid UTF-8 content. 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker## CURLWS_BINARY 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard WorkerThis is binary data. 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard Worker## CURLWS_CONT 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard WorkerThis is not the final fragment of the message, which implies that there is 75*6236dae4SAndroid Build Coastguard Workeranother fragment coming as part of the same message where this bit is not set. 76*6236dae4SAndroid Build Coastguard Worker 77*6236dae4SAndroid Build Coastguard Worker## CURLWS_CLOSE 78*6236dae4SAndroid Build Coastguard Worker 79*6236dae4SAndroid Build Coastguard WorkerClose this transfer. 80*6236dae4SAndroid Build Coastguard Worker 81*6236dae4SAndroid Build Coastguard Worker## CURLWS_PING 82*6236dae4SAndroid Build Coastguard Worker 83*6236dae4SAndroid Build Coastguard WorkerThis is a ping. 84*6236dae4SAndroid Build Coastguard Worker 85*6236dae4SAndroid Build Coastguard Worker## CURLWS_PONG 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard WorkerThis is a pong. 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard Worker## CURLWS_OFFSET 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard WorkerThe provided data is only a partial fragment and there is more coming in a 92*6236dae4SAndroid Build Coastguard Workerfollowing call to *curl_ws_send()*. When sending only a piece of the 93*6236dae4SAndroid Build Coastguard Workerfragment like this, the *fragsize* must be provided with the total 94*6236dae4SAndroid Build Coastguard Workerexpected fragment size in the first call and it needs to be zero in subsequent 95*6236dae4SAndroid Build Coastguard Workercalls. 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS% 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker# EXAMPLE 100*6236dae4SAndroid Build Coastguard Worker 101*6236dae4SAndroid Build Coastguard Worker~~~c 102*6236dae4SAndroid Build Coastguard Worker#include <string.h> /* for strlen */ 103*6236dae4SAndroid Build Coastguard Worker 104*6236dae4SAndroid Build Coastguard Workerconst char *send_payload = "magic"; 105*6236dae4SAndroid Build Coastguard Worker 106*6236dae4SAndroid Build Coastguard Workerint main(void) 107*6236dae4SAndroid Build Coastguard Worker{ 108*6236dae4SAndroid Build Coastguard Worker size_t sent; 109*6236dae4SAndroid Build Coastguard Worker CURLcode res; 110*6236dae4SAndroid Build Coastguard Worker CURL *curl = curl_easy_init(); 111*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_URL, "wss://example.com/"); 112*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 2L); 113*6236dae4SAndroid Build Coastguard Worker curl_easy_perform(curl); 114*6236dae4SAndroid Build Coastguard Worker res = curl_ws_send(curl, send_payload, strlen(send_payload), &sent, 0, 115*6236dae4SAndroid Build Coastguard Worker CURLWS_PING); 116*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(curl); 117*6236dae4SAndroid Build Coastguard Worker return (int)res; 118*6236dae4SAndroid Build Coastguard Worker} 119*6236dae4SAndroid Build Coastguard Worker~~~ 120*6236dae4SAndroid Build Coastguard Worker 121*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY% 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE 124*6236dae4SAndroid Build Coastguard Worker 125*6236dae4SAndroid Build Coastguard Worker*CURLE_OK* (zero) means that the data was sent properly, non-zero means an 126*6236dae4SAndroid Build Coastguard Workererror occurred as *\<curl/curl.h\>* defines. See the libcurl-errors(3) man 127*6236dae4SAndroid Build Coastguard Workerpage for the full list with descriptions. 128