函數原型:int send( SOCKET s,char *buf,int len,int flags );編程
功能:不管是客戶仍是服務器應用程序都用send函數來向TCP鏈接的另外一端發送數據。客戶程序通常用send函數向服務器發送請求,而服務器則一般用send函數來向客戶程序發送應答。服務器
參數一:指定發送端套接字描述符;網絡
參數二:存放應用程序要發送數據的緩衝區;socket
參數三:實際要發送的數據的字節數;函數
參數四:通常置爲0。指針
同步Socket的send函數的執行流程,當調用該函數時,send先比較待發送數據的長度len和套接字s的發送緩衝的長度(由於待發送數據是要copy到套接字s的發送緩衝區的,注意並非send把s的發送緩衝中的數據傳到鏈接的另外一端的,而是協議傳的,send僅僅是把buf中的數據copy到s的發送緩衝區的剩餘空間裏):code
1.若是len大於s的發送緩衝區的長度,該函數返回SOCKET_ERROR;2.若是len小於或者等於s的發送緩衝區的長度,那麼send先檢查協議是否正在發送s的發送緩衝中的數據,若是是就等待協議把數據發送完,若是協議尚未開始發送s的發送緩衝中的數據或者s的發送緩衝中沒有數據,那麼 send就比較s的發送緩衝區的剩餘空間和len:原型
(i)若是len大於剩餘空間大小send就一直等待協議把s的發送緩衝中的數據發送完; (ii)若是len小於剩餘空間大小send就僅僅把buf中的數據copy到剩餘空間裏。
3.若是send函數copy數據成功,就返回實際copy的字節數,若是send在copy數據時出現錯誤,那麼send就返回SOCKET_ERROR;若是send在等待協議傳送數據時網絡斷開的話,那麼send函數也返回SOCKET_ERROR。
注意:send函數把buf中的數據成功copy到s的發送緩衝的剩餘空間裏後它就返回了,可是此時這些數據並不必定立刻被傳到鏈接的另外一端。若是協議在後續的傳送過程當中出現網絡錯誤的話,那麼下一個Socket函數就會返回SOCKET_ERROR。(每個除send外的Socket函數在執行的最開始總要先等待套接字的發送緩衝中的數據被協議傳送完畢才能繼續,若是在等待時出現網絡錯誤,那麼該Socket函數就返回 SOCKET_ERROR)同步
函數原型:int recv( SOCKET s, char *buf, int len, int flags)io
功能:不管是客戶仍是服務器應用程序都用recv函數從TCP鏈接的另外一端接收數據。
參數一:指定接收端套接字描述符;
參數二:指明一個緩衝區,該緩衝區用來存放recv函數接收到的數據;
參數三:指明buf的長度;
參數四 :通常置爲0。
1.recv函數僅僅只能用於套接字io,不能用於文件io和其餘IO,而read函數
能夠用於全部IO.
2.多了一個flag選項
MSG_OOB 緊急指針或帶外數據 TCP頭部中有一個緊急指針 指定發送緊
急數據
MSG_PEEK 接收緩衝區的數據,可是並不將數據從緩衝區清除(read函數一
旦數據從緩衝區讀走,就將數據清除)
同步Socket的recv函數的執行流程:當應用程序調用recv函數時,recv先等待s的發送緩衝中的數據被協議傳送完畢,
若是協議在傳送s的發送緩衝中的數據時出現網絡錯誤,那麼recv函數返回SOCKET_ERROR;
若是s的發送緩衝中沒有數據或者數據被協議成功發送完畢後,recv先檢查套接字s的接收緩衝區,若是s接收緩衝區中沒有數據或者協議正在接收數據,那麼recv就一直
等待,直到協議把數據接收完畢;
當協議把數據接收完畢,recv函數就把s的接收緩衝中的數據copy到buf中(注意協議接收到的數據可能大於buf的長度,因此在這種狀況下要調用幾回recv函數才能把s的接收緩衝中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的),recv函數返回其實際copy的字節數;
若是recv在copy時出錯,那麼它返回SOCKET_ERROR;若是recv函數在等待協議接收數據時網絡中斷了,那麼它返回0。