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;)。
傳回值
若無錯誤發生,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:虛電路被遠端複位。
轉載于:https://www.cnblogs.com/sky-of-chuanqingchen/p/4123365.html