Condividi tramite


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 Significato
MSG_DONTROUTE
Specifica che i dati non devono essere soggetti al routing. Un provider di servizi Windows Sockets può scegliere di ignorare questo flag.
MSG_OOB
Invia dati OOB (socket in stile flusso, ad esempio SOCK_STREAM solo).

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
WSANOTINITIALISED
Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEACCES
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.
WSAEINTR
Una chiamata di Windows Sockets 1.1 bloccata è stata annullata tramite WSACancelBlockingCall.
WSAEINPROGRESS
Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEFAULT
Il parametro buf non è completamente contenuto in una parte valida dello spazio degli indirizzi utente.
WSAENETRESET
Errore rilevato durante operazione dall'attività keep-alive. Connessione interrotta.
WSAENOBUFS
Nessuno spazio di buffer disponibile.
WSAENOTCONN
Il socket non è connesso.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEOPNOTSUPP
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.
WSAESHUTDOWN
Il socket è stato arrestato; non è possibile inviare su un socket dopo l'arresto richiamato con come impostare su SD_SEND o SD_BOTH.
WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazione richiesta blocca.
WSAEMSGSIZE
Il socket è orientato al messaggio e il messaggio è maggiore del massimo supportato dal trasporto sottostante.
WSAEHOSTUNREACH
Impossibile raggiungere l'host remoto da questo host in questo momento.
WSAEINVAL
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.
WSAECONNABORTED
Circuito virtuale terminato a causa di un timeout o di un altro errore. L'applicazione deve chiudere il socket che non è più utilizzabile.
WSAECONNRESET
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.
WSAETIMEDOUT
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.

Nota Quando si emette una chiamata Winsock bloccata, ad esempio send, Winsock potrebbe dover attendere un evento di rete prima che la chiamata possa completare. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di routine asincrona pianificata nello stesso thread. L'emissione di un'altra chiamata winsock bloccata all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread comporterà un comportamento non definito e non deve mai essere tentato dai client Winsock.
 

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 Phone 8: questa funzione è supportata per le app Windows Phone Store in Windows Phone 8 e versioni successive.

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

Vedi anche

Introduzione con Winsock

WSAAsyncSelect

WSAEventSelect

Funzioni Winsock

Informazioni di riferimento su Winsock

Recv

recvfrom

select

Sendto

socket