Funzione WSASendMsg (winsock2.h)

La funzione WSASendMsg invia informazioni di controllo e dati facoltativi da socket connessi e non connessi.

Nota Questa funzione è un'estensione specifica di Microsoft per la specifica Windows Sockets.

 

Sintassi

int WSAAPI WSASendMsg(
  [in]  SOCKET                             Handle,
  [in]  LPWSAMSG                           lpMsg,
  [in]  DWORD                              dwFlags,
  [out] LPDWORD                            lpNumberOfBytesSent,
  [in]  LPWSAOVERLAPPED                    lpOverlapped,
  [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

Parametri

[in] Handle

Descrittore che identifica il socket.

[in] lpMsg

Struttura WSAMSG che archivia la struttura posix.1g msghdr .

[in] dwFlags

I flag usati per modificare il comportamento della chiamata di funzione WSASendMsg . Per altre informazioni, vedere Uso di dwFlags nella sezione Osservazioni.

[out] lpNumberOfBytesSent

Puntatore al numero, in byte, inviato da questa chiamata se l'operazione di I/O viene completata immediatamente.

Usare NULL per questo parametro se il parametro lpOverlapped non è NULL per evitare risultati potenzialmente errati. Questo parametro può essere NULL solo se il parametro lpOverlapped non è NULL.

[in] lpOverlapped

Puntatore a una struttura WSAOVERLAPPED . Ignorato per socket non sovrapposti.

[in] lpCompletionRoutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Puntatore alla routine di completamento chiamata al completamento dell'operazione di invio. Ignorato per socket non sovrapposti.

Valore restituito

Restituisce zero quando si verifica il completamento positivo e immediato. Quando viene restituito zero, la routine di completamento specificata viene chiamata quando il thread chiamante si trova nello stato avvisabile.

Valore restituito di SOCKET_ERROR e chiamata successiva a WSAGetLastError che restituisce WSA_IO_PENDING, indica che l'operazione sovrapposta è stata avviata correttamente; il completamento viene quindi indicato tramite altri mezzi, ad esempio tramite eventi o porte di completamento.

In caso di errore, restituisce SOCKET_ERROR e una chiamata successiva a WSAGetLastError restituisce un valore diverso da WSA_IO_PENDING. Nella tabella seguente sono elencati i codici di errore.

Codice di errore Significato
WSAEACCES
L'indirizzo richiesto è un indirizzo di trasmissione, ma il flag appropriato non è stato impostato.
WSAECONNRESET
Per un socket di datagrammi UDP, questo errore indica che un'operazione di invio precedente ha generato un messaggio ICMP "Port Unreachable".
WSAEFAULT
Il parametro lpMsg, lpNumberOfBytesSent, lpOverlapped o lpCompletionRoutine non è totalmente contenuto in una parte valida dello spazio indirizzi utente. Questo errore viene restituito anche se un membro del nome della struttura WSAMSG puntato al parametro lpMsg è un puntatore NULL e il membro namelen della struttura WSAMSG non è stato impostato su zero. Questo errore viene restituito anche se un membro Control.buf della struttura WSAMSG puntato al parametro lpMsg era un puntatore NULL e il membro Control.len della struttura WSAMSG non è stato impostato su zero.
WSAEINPROGRESS
Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEINTR
Una chiamata di Windows Socket 1.1 bloccata è stata annullata tramite WSACancelBlockingCall.
WSAEINVAL
Il socket non è stato associato all'associazione oppure il socket non è stato creato con il flag sovrapposto.
WSAEMSGSIZE
Il socket è orientato al messaggio e il messaggio è maggiore del massimo supportato dal trasporto sottostante.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAENETRESET
Per un socket di datagramma, questo errore indica che la durata (TTL) è scaduta.
WSAENETUNREACH
La rete non è raggiungibile.
WSAENOBUFS
Il provider Windows Sockets segnala un deadlock del buffer.
WSAENOTCONN
Il socket non è connesso.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEOPNOTSUPP
L'operazione socket non è supportata. Questo errore viene restituito se il membro dwFlags della struttura WSAMSG puntato al parametro lpMsg include eventuali flag di controllo non validi per WSASendMsg.
WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamare la funzione WSASendMsg in un socket dopo l'arresto richiamato con come impostare su SD_SEND o SD_BOTH.
WSAETIMEDOUT
Timeout del socket. Questo errore viene restituito se il socket ha un timeout di attesa specificato usando l'opzione socket SO_SNDTIMEO e il timeout è stato superato.
WSAEWOULDBLOCK
Socket sovrapposti: sono presenti troppe richieste di I/O in sospeso. Socket non sovrapposti: il socket è contrassegnato come non bloccante e l'operazione di invio non può essere completata immediatamente.
WSANOTINITIALISED
Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita.
WSA_IO_PENDING
Un'operazione sovrapposta è stata avviata correttamente e il completamento verrà indicato in un secondo momento.
WSA_OPERATION_ABORTED
L'operazione sovrapposta è stata annullata a causa della chiusura del socket o a causa dell'esecuzione del comando SIO_FLUSH in WSAIoctl.

Commenti

La funzione WSASendMsg può essere usata al posto delle funzioni WSASend e WSASendTo. La funzione WSASendMsg può essere usata solo con datagrammi e socket non elaborati. Il descrittore socket nel parametro s deve essere aperto con il tipo di socket impostato su SOCK_DGRAM o SOCK_RAW.

Il parametro dwFlags può contenere solo una combinazione dei flag di controllo seguenti: MSG_DONTROUTE, MSG_PARTIAL e MSG_OOB. Il membro dwFlags della struttura WSAMSG a cui punta il parametro lpMsg viene ignorato nell'input e non usato nell'output.

Nota Il puntatore della funzione per la funzione WSASendMsg deve essere ottenuto in fase di esecuzione eseguendo una chiamata alla funzione WSAIoctl con il SIO_GET_EXTENSION_FUNCTION_POINTER codice opcode specificato. Il buffer di input passato alla funzione WSAIoctl deve contenere WSAID_WSASENDMSG, un identificatore univoco globale (GUID) il cui valore identifica la funzione di estensione WSASendMsg . In caso di esito positivo, l'output restituito dalla funzione WSAIoctl contiene un puntatore alla funzione WSASendMsg . Il GUID WSAID_WSASENDMSG è definito nel file di intestazione Mswsock.h .
 

I socket sovrapposti vengono creati con una chiamata di funzione WSASocket con il flag WSA_FLAG_OVERLAPPED impostato. Per i socket sovrapposti, l'invio di informazioni usa operazioni di I/O sovrapposte a meno che sia lpOverlapped che lpCompletionRoutine siano NULL; quando lpOverlapped e lpCompletionRoutine sono NULL, il socket viene considerato come socket non sovrapposto. Un'indicazione di completamento si verifica con socket sovrapposti; una volta che il buffer o i buffer sono stati utilizzati dal trasporto, viene attivata una routine di completamento o viene impostato un oggetto evento. Se l'operazione non viene completata immediatamente, lo stato di completamento finale viene recuperato tramite la routine di completamento o chiamando la funzione WSAGetOverlappedResult .

Per i socket non sovrapposti, i parametri lpOverlapped e lpCompletionRoutine vengono ignorati e WSASendMsg adotta la stessa semantica di blocco della funzione di invio : i dati vengono copiati dal buffer o dai buffer nel buffer del trasporto. Se il socket non è bloccato e orientato al flusso e non è disponibile spazio nel buffer del trasporto, WSASendMsg restituisce con solo parte dei buffer dell'applicazione che sono stati utilizzati. Al contrario, questa situazione di buffer in un socket di blocco comporta il blocco di WSASendMsg fino a quando non è stato utilizzato tutto il contenuto del buffer dell'applicazione.

Se questa funzione viene completata in modo sovrapposto, è responsabilità del provider di servizi Winsock acquisire questa struttura WSABUF prima di restituire dalla chiamata. Ciò consente alle applicazioni di creare matrici WSABUF basate sullo stack puntate dal membro lpBuffers della struttura WSAMSG a cui punta il parametro lpMsg .

Per i socket orientati ai messaggi, è necessario prestare attenzione a non superare le dimensioni massime del messaggio del provider sottostante, che può essere ottenuto ottenendo il valore dell'opzione socket SO_MAX_MSG_SIZE. Se i dati sono troppo lunghi per passare atomicamente attraverso il protocollo sottostante, l'errore WSAEMSGSIZE viene restituito e non vengono trasmessi dati.

In un socket IPv4 di tipo SOCK_DGRAM o SOCK_RAW, un'applicazione può specificare l'indirizzo di origine IP locale da usare per l'invio con la funzione WSASendMsg . Uno degli oggetti dati di controllo passati nella struttura WSAMSG alla funzione WSASendMsg può contenere una struttura in_pktinfo utilizzata per specificare l'indirizzo di origine IPv4 locale da usare per l'invio.

In un socket IPv6 di tipo SOCK_DGRAM o SOCK_RAW, un'applicazione può specificare l'indirizzo di origine IP locale da usare per l'invio con la funzione WSASendMsg . Uno degli oggetti dati di controllo passati nella struttura WSAMSG alla funzione WSASendMsg può contenere una struttura in6_pktinfo utilizzata per specificare l'indirizzo di origine IPv6 locale da usare per l'invio.

Per un socket dual stack durante l'invio di datagrammi con la funzione WSASendMsg e un'applicazione vuole specificare un indirizzo di origine IP locale specifico da usare, il metodo da gestire dipende dall'indirizzo IP di destinazione. Quando si invia a un indirizzo di destinazione IPv4 o a un indirizzo di destinazione IPv4 mappato a IPv4, uno degli oggetti dati di controllo passati nella struttura WSAMSG a cui punta il parametro lpMsg deve contenere una struttura in_pktinfo contenente l'indirizzo di origine IPv4 locale da usare per l'invio. Quando si invia a un indirizzo di destinazione IPv6 che non è un indirizzo IPv4 mappato APv6, uno degli oggetti dati del controllo passati nella struttura WSAMSG a cui punta il parametro lpMsg deve contenere una struttura in6_pktinfo contenente l'indirizzo di origine IPv6 locale da usare per l'invio.

Nota L'opzione socket SO_SNDTIMEO si applica solo ai socket di blocco.
 
Nota Il completamento corretto di un WSASendMsg non indica che i dati sono stati recapitati correttamente.
 
Nota Quando si esegue una chiamata Winsock bloccante, ad esempio WSASendMsg con il parametro lpOverlapped impostato su NULL, Winsock potrebbe dover attendere un evento di rete prima che la chiamata possa essere completata. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di procedura asincrona pianificata nello stesso thread. L'esecuzione di un'altra chiamata Winsock bloccante all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread causerà un comportamento non definito e non deve mai essere tentata dai client Winsock.
 

Dwflags

Il parametro di input dwFlags può essere usato per influenzare il comportamento della chiamata di funzione oltre le opzioni specificate per il socket associato. Ovvero, la semantica di questa funzione è determinata dalle opzioni del socket e dal parametro dwFlags . Quest'ultimo 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_PARTIAL Specifica che lpMsg-lpBuffers> contiene solo un messaggio parziale. Si noti che il codice di errore WSAEOPNOTSUPP verrà restituito dai trasporti che non supportano le trasmissioni parziali dei messaggi.
 

I valori possibili per il parametro dwFlags sono definiti nel file di intestazione Winsock2.h .

Nell'output, il membro dwFlags della struttura WSAMSG a cui punta il parametro lpMsg non viene usato.

I/O del socket sovrapposto

Se un'operazione sovrapposta viene completata immediatamente, WSASendMsg restituisce un valore zero e il parametro lpNumberOfBytesSent viene aggiornato con il numero di byte inviati. Se l'operazione sovrapposta viene avviata correttamente e verrà completata in un secondo momento, WSASendMsg restituisce SOCKET_ERROR e indica il codice di errore WSA_IO_PENDING. In questo caso , lpNumberOfBytesSent non viene aggiornato. Al termine dell'operazione sovrapposta, la quantità di dati trasferiti viene indicata tramite il parametro cbTransferred nella routine di completamento (se specificato) o tramite il parametro lpcbTransfer in WSAGetOverlappedResult.
Nota Tutte le operazioni di I/O avviate da un determinato thread vengono annullate quando il thread viene chiuso. Per i socket sovrapposti, le operazioni asincrone in sospeso possono avere esito negativo se il thread viene chiuso prima del completamento delle operazioni. Per altre informazioni, vedere ExitThread .
 

La funzione WSASendMsg che usa operazioni di I/O sovrapposte può essere chiamata dalla routine di completamento di una funzione precedente, WSARecv, WSARecvFrom, LPFN_WSARECVMSG (WSARecvMsg),WSASend, WSASendMsg o WSASendTo . In questo modo le trasmissioni di dati sensibili al tempo vengono eseguite interamente all'interno di un contesto preemptive.

Il parametro lpOverlapped deve essere valido per la durata dell'operazione sovrapposta. Se più operazioni di I/O sono in attesa simultaneamente, ognuna deve fare riferimento a una struttura WSAOVERLAPPED separata.

Se il parametro lpCompletionRoutine è NULL, il parametro hEvent di lpOverlapped viene segnalato quando l'operazione sovrapposta viene completata se contiene un handle di oggetto evento valido. Un'applicazione può usare WSAWaitForMultipleEvents o WSAGetOverlappedResult per attendere o eseguire il polling sull'oggetto evento.

Se lpCompletionRoutine non è NULL, il parametro hEvent viene ignorato e può essere usato dall'applicazione per passare le informazioni di contesto alla routine di completamento. Un chiamante che passa una richiesta di I/O non NULLlpCompletionRoutine e successive chiama WSAGetOverlappedResult per la stessa richiesta di I/O sovrapposta potrebbe non impostare il parametro fWait per tale chiamata di WSAGetOverlappedResult su TRUE. In questo caso, l'utilizzo del parametro hEvent non è definito e il tentativo di attendere il parametro hEvent produrrebbe risultati imprevedibili.

La routine di completamento segue le stesse regole previste per le routine di completamento di I/O dei file di Windows. La routine di completamento non verrà richiamata finché il thread non è in uno stato di attesa di avviso, ad esempio con WSAWaitForMultipleEvents chiamato con il parametro fAlertable impostato su TRUE.

I provider di trasporto consentono a un'applicazione di richiamare operazioni di invio e ricezione dall'interno del contesto della routine di completamento I/O del socket e garantire che, per un determinato socket, le routine di completamento di I/O non verranno annidate. In questo modo le trasmissioni di dati sensibili al tempo vengono eseguite interamente all'interno di un contesto preemptive.

Il prototipo della routine di completamento è il seguente.


void CALLBACK CompletionRoutine(
  IN DWORD dwError,
  IN DWORD cbTransferred,
  IN LPWSAOVERLAPPED lpOverlapped,
  IN DWORD dwFlags
);

La funzione CompletionRoutine è un segnaposto per un nome di funzione definito dall'applicazione o definito dalla libreria. Il parametro dwError specifica lo stato di completamento per l'operazione sovrapposta, come indicato dal parametro lpOverlapped . Il parametro cbTransferred indica il numero di byte inviati. Attualmente non sono definiti valori di flag e il parametro dwFlags sarà zero. La funzione CompletionRoutine non restituisce un valore.

La restituzione da questa funzione consente la chiamata di un'altra routine di completamento in sospeso per il socket. Tutte le routine di completamento in attesa vengono chiamate prima che l'attesa del thread di avviso venga soddisfatta con un codice restituito di WSA_IO_COMPLETION. Le routine di completamento possono essere chiamate in qualsiasi ordine, non necessariamente nello stesso ordine in cui vengono completate le operazioni sovrapposte. Tuttavia, è garantito che i buffer inviati vengano inviati nello stesso ordine in cui vengono specificati.

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 2008 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione winsock2.h (include Mswsock.h)
Libreria Ws2_32.lib
DLL Ws2_32.dll

Vedi anche

ExitThread

IPV6_PKTINFO

IP_PKTINFO

WSABUF

WSACancelBlockingCall

WSAGetLastError

WSAGetOverlappedResult

Wsaioctl

WSAMSG

WSAOVERLAPPED

WSASend

WSASendTo

WSASocket

WSAStartup

WSAWaitForMultipleEvents

Funzioni Winsock

Informazioni di riferimento su Winsock

bind

in6_pktinfo

in_pktinfo

send

shutdown