C函數篇(send函數)

send()用於向一個已經鏈接的socket發送數據,若是無錯誤,返回值爲所發送數據的總數,不然返回SOCKET_ERROR。網絡

簡述

向一個已鏈接的 套接口發送數據。
#include < winsock.h>
int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
s:一個用於標識已鏈接套接口的描述字。
buf:包含待發送數據的 緩衝區
len:緩衝區中數據的長度。
flags:調用執行方式。

註釋

send()適用於已鏈接的數據包或流式 套接口發送數據。對於數據報類套接口,必需注意發送數據長度不該超過 通信子網的IP包最大長度。IP包最大長度在 WSAStartup()調用返回的WSAData的iMaxUdpDg元素中。若是數據太長沒法自動經過下層協議,則返回WSAEMSGSIZE錯誤,數據不會被髮送。
請注意成功地完成send()調用並不意味着 數據傳送到達。
若是傳送系統的 緩衝區空間不夠保存需傳送的數據,除非套接口處於非阻塞I/O方式,不然send()將阻塞。對於非阻塞SOCK_STREAM類型的套接口,實際寫的數據數目可能在1到所需大小之間,其值取決於本地和遠端主機的 緩衝區大小。可用 select()調用來肯定什麼時候可以進一步發送數據。
在相關套接口的選項之上,還可經過標誌位flag來影響函數的執行方式。也就是說,本函數的語義既取決於套接口的選項也取決於標誌位。後者由如下一些值組成:

值意義

MSG_DONTROUTE 指明數據不選徑。一個WINDOWS套接口供應商能夠忽略此標誌;MSG_OOB 發送帶外數據(僅適用於SO_STREAM;)。socket

返回值

若無錯誤發生,send()返回所發送數據的總數(請注意這個數字可能小於len中所規定的大小)。不然的話,返回SOCKET_ERROR錯誤, 應用程序可經過WSAGetLastError()獲取相應 錯誤代碼
WSANOTINITIALISED:在使用此API以前應首先成功地調用WSAStartup()。
WSAENETDOWN:WINDOWS 套接口實現檢測到網絡子系統失效。
WSAEACESS:要求地址爲廣播地址,但相關標誌未能正確設置。
WSAEINTR:經過一個 WSACancelBlockingCall()來取消一個(阻塞的)調用。
WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。
WSAEFAULT:buf參數不在用戶 地址空間中的有效位置。
WSAENETRESET:因爲WINDOWS套接口實現放棄了鏈接,故該鏈接必需被複位。
WSAENOBUFS:WINDOWS套接口實現報告一個 緩衝區 死鎖
WSAENOTCONN:套接口未被鏈接。
WSAENOTSOCK:描述字不是一個套接口。
WSAEOPNOTSUPP:已設置了MSG_OOB,但套接口非SOCK_STREAM類型。
WSAESHUTDOWN:套接口已被關閉。一個套接口以1或2的how參數調用 shutdown()關閉後,沒法再用send()函數。
WSAEWOULDBLOCK:
WSAEMSGSIZE:套接口爲 SOCK_DGRAM類型,且數據報大於WINDOWS套接口實現所支持的最大值。
WSAEINVAL:套接口未用 bind()捆綁。
WSAECONNABORTED:因爲超時或其餘緣由引發虛電路的中斷。
WSAECONNRESET:虛電路被遠端復位。
相關文章
相關標籤/搜索