funzione send (winsock2.h)
La funzione di invio invia dati su un socket connesso.
Sintassi
int WSAAPI send(
[in] SOCKET s,
[in] const char *buf,
[in] int len,
[in] int flags
);
Parametri
[in] s
Descrittore che identifica un socket connesso.
[in] buf
Puntatore a un buffer contenente i dati da trasmettere.
[in] len
Lunghezza, in byte, dei dati nel buffer a cui punta il parametro buf .
[in] flags
Set di flag che specificano il modo in cui viene effettuata la chiamata. Questo parametro viene costruito usando l'operatore OR bit per bit con uno dei valori seguenti.
Valore restituito
Se non si verifica alcun errore, invia restituisce il numero totale di byte inviati, che può essere minore del numero richiesto per l'invio nel parametro len . In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.
Codice di errore | Significato |
---|---|
Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita. | |
Il sottosistema di rete non è riuscito. | |
L'indirizzo richiesto è un indirizzo di trasmissione, ma il flag appropriato non è stato impostato. Chiama setockopt con l'opzione socket SO_BROADCAST per abilitare l'uso dell'indirizzo di trasmissione. | |
Una chiamata di Windows Sockets 1.1 bloccata è stata annullata tramite WSACancelBlockingCall. | |
Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
Il parametro buf non è completamente contenuto in una parte valida dello spazio degli indirizzi utente. | |
Errore rilevato durante operazione dall'attività keep-alive. Connessione interrotta. | |
Nessuno spazio di buffer disponibile. | |
Il socket non è connesso. | |
Il descrittore non è un socket. | |
MSG_OOB è stato specificato, ma il socket non è in stile di flusso, ad esempio il tipo SOCK_STREAM, i dati OOB non sono supportati nel dominio di comunicazione associato a questo socket o il socket è unidirectional e supporta solo le operazioni di ricezione. | |
Il socket è stato arrestato; non è possibile inviare su un socket dopo l'arresto richiamato con come impostare su SD_SEND o SD_BOTH. | |
Il socket è contrassegnato come non bloccante e l'operazione richiesta blocca. | |
Il socket è orientato al messaggio e il messaggio è maggiore del massimo supportato dal trasporto sottostante. | |
Impossibile raggiungere l'host remoto da questo host in questo momento. | |
Il socket non è stato associato all'associazione o è stato specificato un flag sconosciuto oppure MSG_OOB è stato specificato per un socket con SO_OOBINLINE abilitato. | |
Circuito virtuale terminato a causa di un timeout o di un altro errore. L'applicazione deve chiudere il socket che non è più utilizzabile. | |
Circuito virtuale reimpostato dal lato remoto durante l'esecuzione di una chiusura definitiva o anomala. Per i socket UDP, l'host remoto non è riuscito a recapitare un datagramma UDP inviato in precedenza e ha risposto con un pacchetto ICMP "Port Unreachable". L'applicazione deve chiudere il socket che non è più utilizzabile. | |
La connessione è stata eliminata, a causa di un errore di rete o perché il sistema sull'altra parte è stato disattivato senza preavviso. |
Commenti
La funzione di invio viene usata per scrivere dati in uscita in un socket connesso.
Per i socket orientati ai messaggi (famiglia di indirizzi di AF_INET o AF_INET6, tipo di SOCK_DGRAM e protocollo diIPPROTO_UDP, ad esempio, è necessario prestare attenzione a non superare le dimensioni massime del pacchetto sottostante. La dimensione massima dei pacchetti di messaggi per un provider può essere ottenuta chiamando getsockopt con il parametro optname impostato su SO_MAX_MSG_SIZE per recuperare il valore dell'opzione socket. Se i dati sono troppo lunghi da passare atomicamente attraverso il protocollo sottostante, viene restituito l'errore WSAEMSGSIZE e non vengono trasmessi dati.
Il completamento riuscito di una funzione di invio non indica che i dati sono stati recapitati correttamente e ricevuti al destinatario. Questa funzione indica solo che i dati sono stati inviati correttamente.
Se non è disponibile spazio buffer all'interno del sistema di trasporto per contenere i dati da trasmettere, l'invio bloccherà a meno che il socket non sia stato inserito in modalità non di blocco. Nei socket orientati al flusso non sbloccati, il numero di byte scritti può essere compreso tra 1 e la lunghezza richiesta, a seconda della disponibilità del buffer nei computer client e server. Le funzioni select, WSAAsyncSelect o WSAEventSelect possono essere usate per determinare quando è possibile inviare altri dati.
La chiamata all'invio con un parametro len pari a zero è consentita e verrà considerata con esito positivo dalle implementazioni. In questi casi, l'invio restituirà zero come valore valido. Per i socket orientati ai messaggi, viene inviato un datagram di trasporto a lunghezza zero.
Il parametro flag può essere usato per influenzare il comportamento della funzione oltre le opzioni specificate per il socket associato. La semantica della funzione di invio è determinata da qualsiasi opzione impostata in precedenza nel socket specificato nel parametro s e il parametro flag passati alla funzione di invio .
L'ordine delle chiamate effettuate per l'invio è anche l'ordine in cui i buffer vengono trasmessi al livello di trasporto. l'invio non deve essere chiamato nello stesso socket orientato al flusso simultaneamente da thread diversi, perché alcuni provider Winsock possono suddividere una richiesta di invio di grandi dimensioni in più trasmissioni e ciò può causare l'interleaving dei dati non intenzionali da più richieste di invio simultanee nello stesso socket orientato al flusso.
Codice di esempio
Nell'esempio seguente viene illustrato l'uso della funzione di invio .#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 27015
int main() {
//----------------------
// Declare and initialize variables.
int iResult;
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct sockaddr_in clientService;
int recvbuflen = DEFAULT_BUFLEN;
char *sendbuf = "Client: sending data test";
char recvbuf[DEFAULT_BUFLEN] = "";
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error: %d\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( DEFAULT_PORT );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if (iResult == SOCKET_ERROR) {
wprintf(L"connect failed with error: %d\n", WSAGetLastError() );
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
//----------------------
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
wprintf(L"send failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %d\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
wprintf(L"shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
wprintf(L"Bytes received: %d\n", iResult);
else if ( iResult == 0 )
wprintf(L"Connection closed\n");
else
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
} while( iResult > 0 );
// close the socket
iResult = closesocket(ConnectSocket);
if (iResult == SOCKET_ERROR) {
wprintf(L"close failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
WSACleanup();
return 0;
}
Codice di esempio
Per un altro esempio che usa la funzione di invio, vedere Introduzione With Winsock.Note per i socket IrDA
- Il file di intestazione Af_irda.h deve essere incluso in modo esplicito.
Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 8.1, Windows Vista [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | winsock2.h |
Libreria | Ws2_32.lib |
DLL | Ws2_32.dll |