sendto()

sendto()適用於已連線的數據報或流式套接口傳送數據。對於數據報類套接口,必需注意傳送數據長度不應超過通訊子網的IP包最大長度。IP包最大長度在WSAStartup()調用返回的WSAData的iMaxUdpDg元素中。如果數據太長無法自動通過下層協定,則返回WSAEMSGSIZE錯誤,數據不會被傳送。

簡述

向一指定目的地傳送數據
#include <winsock.h>
int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
const struct sockaddr FAR* to, int tolen);
s:一個標識套接口描述字。
buf:包含待傳送數據的緩衝區。
len:buf緩衝區中數據的長度。
flags:調用方式標誌位。
to:(可選)指針,指向目的套接口的地址
tolen:to所指地址的長度。

注釋

sendto()適用於已連線的數據報或流式套接口傳送數據。對於數據報類套接口,必需注意傳送數據長度不應超過通訊子網的IP包最大長度。IP包最大長度在WSAStartup()調用返回的WSADATA的iMaxUdpDg元素中。如果數據太長無法自動通過下層協定,則返回WSAEMSGSIZE錯誤,數據不會被傳送。
請注意成功地完成sendto()調用並不意味著數據傳送到達。
sendto()函式主要用於SOCK_DGRAM類型套接口向to參數指定端的套接口傳送數據報。對於SOCK_STREAM類型套接口,to和tolen參數被忽略;這種情況下sendto()等價於send()。
為了傳送廣播數據(僅適用於SOCK_DGRAM),in參數所含地址應該把特定的IP位址INADDR_BROADCAST(winsock.h中有定義)和終端地址結合起來構造。通常建議一個廣播數據報的大小不要大到以致產生碎片,也就是說數據報的數據部分(包括頭)不超過512位元組。
如果傳送系統的緩衝區空間不夠保存需傳送的數據,除非套接口處於非阻塞I/O方式,否則sendto()將阻塞。對於非阻塞SOCK_STREAM類型的套接口,實際寫的數據數目可能在1到所需大小之間,其值取決於本地和遠端主機的緩衝區大小。可用select()調用來確定何時能夠進一步傳送數據。
在相關套接口的選項之上,還可通過標誌位flag來影響函式的執行方式。也就是說,本函式的語義既取決於套接口的選項也取決於標誌位。後者由以下一些值組成:
值 意義
MSG_DONTROUTE 指明數據不選徑。一個WINDOWS套接口供應商可以忽略此標誌;參見2.4節中關於SO_DONTROUTE的討論。
MSG_OOB 傳送帶外數據(僅適用於SO_STREAM;參見2.2.3節)。
返回值:
若無錯誤發生,send()返回所傳送數據的總數(請注意這個數字可能小於len中所規定的大小)。否則的話,返回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError()獲取相應錯誤代碼。
錯誤代碼:
WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。
WSAENETDOWN:WINDOWS套接口實現檢測到網路子系統失效。
WSAEACESS:要求地址為廣播地址,但相關標誌未能正確設定。
WSAEINTR:通過一個WSACancelBlockingCall()來取消一個(阻塞的)調用。
WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。
WSAEFAULT:buf或to參數不是用戶地址空間的一部分,或to參數太小(小於sockaddr結構大小)。
WSAENETRESET:由於WINDOWS套接口實現放棄了連線,故該連線必需被復位。
WSAENOBUFS:WINDOWS套接口實現報告一個緩衝區死鎖。
WSAENOTCONN:套接口未被連線。
WSAENOTSOCK:描述字不是一個套接口。
WSAEOPNOTSUPP:已設定了MSG_OOB,但套接口非SOCK_STREAM類型。
WSAESHUTDOWN:套接口已被關閉。一個套接口以1或2的how參數調用shutdown()關閉後,無法再用sned()函式。
WSAEWOULDBLOCK:套接口被標誌為非阻塞, 但該調用會產生阻塞。
WSAEMSGSIZE:套接口為SOCK_DGRAM類型,且數據報大於WINDOWS套接口實現所支持的最大值。
WSAECONNABORTED:由於逾時或其他原因引起虛電路的中斷。
WSAECONNRESET:虛電路被遠端復位。
WSAEADDRNOTAVAIL:所指地址無法從本地主機獲得。
WSAEAFNOSUPPORT:所指定地址族中地址無法與本套接口一切使用。
WSAEDESADDRREQ:需要目的地址。
WSAENETUNREACH:當前無法從本主機聯上網路。
參見:
recv(), recvfrom(), socket(), send(), WSAStartup().

相關詞條

相關搜尋

熱門詞條

聯絡我們