『壹』 Socket send函數和recv函數詳解
send函數
在Socket編程中,send函數用於向TCP連接另一端發送數據。無論客戶端或伺服器應用程序,均能使用此函數。客戶端通常用send向伺服器發送請求,而伺服器則用它回應客戶端。該函數接受套接字描述符、發送數據緩沖區、數據位元組數及標志參數作為輸入。函數比較要發送的數據長度與套接字的發送緩沖區大小。若大於,則返回SOCKET_ERROR。若小於或等於,則檢查協議是否正在發送數據或套接字緩沖區是否有數據。若協議未開始發送或無數據,則比較剩餘空間與數據長度。若大於,則等待協議發送數據;若小於,則將數據復制到剩餘空間。成功復制後,返回實際復制的位元組數。出現錯誤時,返回SOCKET_ERROR。若在等待協議發送數據時網路中斷,也返回SOCKET_ERROR。在Unix系統下,進程會收到SIGPIPE信號,處理終止。對於非同步Socket的send函數,在網路剛斷開時仍能發送,並返回相應位元組數,select檢測也是可寫的,但稍後再次發送會出錯。select檢測無法檢測出可寫狀態。
recv函數
recv函數用於從TCP連接另一端接收數據。客戶端和伺服器應用程序都可使用此函數。函數接收套接字描述符、接收數據緩沖區、數據長度及標志參數。執行流程如下:等待s的發送緩沖中的數據被協議完全傳輸。若在傳輸中出現網路錯誤,返回SOCKET_ERROR。若發送緩沖無數據或數據傳輸完畢,檢查套接字接收緩沖區。若無數據或協議正在接收數據,則等待協議接收完畢。將s接收緩沖中的數據復制到buf中,返回實際復制的位元組數。復制時出現錯誤,返回SOCKET_ERROR。若在等待協議接收數據時網路中斷,返回0。在Unix系統下,進程會收到SIGPIPE信號,處理終止。
『貳』 在socket編程中怎麼判斷recv是否接收完成
recv函數怎麼判斷接收結束:
1、例如在數據流中帶個結束標識,那樣讀到結束標識就知道傳輸完成,停止。 這種方法只能用傳輸文本文件,有個文件結束符,二進制文件不行。
2、先傳個長度,那麼接收方就可以控制 接下來要讀取多少個位元組的數據才算完成。這個適合傳輸任何文件。
例子:
C/C++ code
client的發函數為:char line[MAXLINE]; while ((fgets(line,MAXLINE,fd)!=NULL) // fd 為一個文件的指針 {send (connfd, line,strlen(line),0) // connfd為 socket}server 的接收函數為:for (;;) {if ((n=recv(connfd, recvline,MAXLINE,0)>0) {recvline[n]=0;fputs(stdout,recvline);else break;}}
當發端停止發送後,收端無法得知數據已經傳輸完畢,從而一直在for中死循環,可以用以上方法判斷接收結束。