send()

基本信息

簡述

向一個已連線套接口傳送數據
#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;)。

返回值

若無錯誤發生,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()關閉後,無法再用sned()函式。
WSAEWOULDBLOCK:
WSAEMSGSIZE:套接口為SOCK_DGRAM類型,且數據報大於WINDOWS套接口實現所支持的最大值。
WSAEINVAL:套接口未用bind()捆綁。
WSAECONNABORTED:由於逾時或其他原因引起虛電路的中斷。
WSAECONNRESET:虛電路被遠端復位。
參見:
recv(), recvfrom(), socket(), sendto(), WSAStartup().

相關詞條

相關搜尋

熱門詞條

聯絡我們