簡述
向指定地址傳送數據,可能的話使用重疊輸入/輸出操作。
#include <winsock2.h>
int WSAAPI WSASendTo ( SOCKET s, LPWSABUF
lpBuffers, DWORD dwBufferCount, LPDWORD
lpNumberOfBytesSent, int iFlags, LPVOID lpTo, int
iToLen, LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE
lpCompletionRoutine );
s:用於標識一個已連線的套接口,該套接口以WSA_FLAG_OVERLAPPED標誌調用WSASocket()創建。
lpBuffers:一個指向WSABUF結構數組的指針。每個WSABUF結構包含緩衝區的指針和緩衝區的大小。
dwBufferCount:lpBuffers數組中WSABUF結構的數目。
lpNumberOfBytesSent:如果傳送操作立即完成,則為一個指向所傳送數據位元組數的指針。
iFlags:標誌位。
lpTo:(可選)指針,指向目標套接口的地址。
lpTolen:lpTo中地址的大小。
lpOverlapped:指向WSAOVERLAPPED結構的指針(對於非重疊套接口則忽略)。
lpCompletionRoutine:一個指向傳送操作完成後調用的完成例程的指針。(對於非重疊套接口則忽略)。
返回值
若無錯誤發生且傳送操作立即完成,則WSASendTo()函式返回所傳送的位元組數(請注意它可能小於len所指定的值)。請注意在這種情況下完成指示(啟動指定的完成例程或設定一個事件對象)將早已發生。否則的話,將返回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError()來獲取相應的錯誤代碼。錯誤代碼WSA_IO_PENDING表示重疊操作成功啟動,過後將有完成指示。任何其他的錯誤表示重疊操作未能成功地啟動,以後也不會有完成指示。
如果設定了MSG_INTERRUPT標誌,則返回值的含義變化。零表示成功,具體含義同上。否則的話,返回值直接包含如下所示的錯誤代碼。由於中斷環境中無法調用WSAGetLastError(),故是必需的。請注意僅適用於Win16環境,僅適用於PROTOCOL_INFO結構中設定了XP1_INTERRUPT位的協定。
錯誤代碼:
WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAENETDOWN 網路子系統失效。
WSAEACCES 請求的地址為廣播地址,但未設定相應的標誌位。
WSAEINTR 通過WSACancelBlockingCall()函式取消(阻塞)調用。
WSAEINPROGRESS 一個阻塞的WinSock調用正在進行中,或者服務提供者仍在處理一個回調函式
WSAEFAULT lpBuffer或lpTo參數不是用戶地址空間的一部分;或者lpTo參數太小(小於sockaddr結構的大小)。
WSAENETRESET 遠端主機復位造成連線的中止。
WSAENOBUFS WinSock提供者報告了一個緩衝區死鎖。
WSAENOTCONN 套接口未連線(僅適用於面向連線的套接口)。
WSAENOTSOCK 描述字不是一個套接口。
WSAEOPNOTSUPP 設定了MSG_OOB,但是該套接口不是諸如SOCK_STREAM流類型的,與套接口相關的通訊域不支持帶外數據,或者套接口是單向的,只支持接收操作。
WSAESHUTDOWN 套接口已經關閉;一個套接口以SD_SEND或SD _BOTH的how參數shutdown()後,無法進行WSASendTo()調用。
WSAEWOULDBLOCK 太多重疊的輸入/輸出請求。
WSAEMSGSIZE 套接口是面向訊息的,且訊息大於底層傳送所支持的最大長度。
WSAEINVAL 套接口未用bind()捆綁,或者套接口未用重疊標誌位創建。
WSAECONNABORTED 由於逾時或其他錯誤導致虛電路中止。
WSAECONNRESET 虛電路被遠端復位。
WSAEADDRNOTAVAIL 本地主機無法獲取所指定的地址。
WSAEAFNOSUPPORT 指定地址族中的地址無法與本套接口一起使用。
WSAEDESTADDRREQ 需要目的地地址。
WSAENETUNREACH 當前無法從本主機聯繫網路。
WSA_IO_PENDING 成功啟動一個重疊操作,過後將有完成指示。
另請參閱:WSACloseEvent(),WSACreateEvent(),WSAGetOverlappedResult(), WSASocket(),WSAWaitForMultipleEvents()