recv函數怎么判斷接收結束:
創新互聯建站于2013年成立,是專業互聯網技術服務公司,擁有項目成都做網站、網站建設、外貿營銷網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元秦安做網站,已為上家服務,為秦安各地企業和個人服務,聯系電話:18982081108
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中死循環,可以用以上方法判斷接收結束。
因為服務器是一對多客戶端;
而對于客戶端來說,是1對1服務器;
所以,服務器在等待某個客戶端的時候,去執行其他客戶端的請求。
需要將recv設置超時,Linux下設置超時如下:
//設置發送超時
struct timeval timeout={3,0};//3s
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)timeout,sizeof(struct timeval));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)timeout,sizeof(struct timeval));
windows下設置超時如下:
int timeout = 3000; //3s
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,timeout,sizeof(timeout));
1、如果對方斷開連接的話,那么readNum = recv ( socketId, rcvBuf, rcvBufSize, 0 );
readNum返回值應該是0,可以根據返回值判斷。
2、recv函數返回值說明
recv函數
int recv( SOCKET s, char FAR *buf, int len, int flags);
不論是客戶還是服務器應用程序都用recv函數從TCP連接的另一端接收數據。該函數的第一個參數指定接收端套接字描述符; 第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據; 第三個參數指明buf的長度; 第四個參數一般置0。
這里只描述同步Socket的recv函數的執行流程。當應用程序調用recv函數時,
(1)recv先等待s的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網絡錯誤,那么recv函數返回SOCKET_ERROR,
(2)如果s的發送緩沖中沒有數據或者數據被協議成功發送完畢后,recv先檢查套接字s的接收緩沖區,如果s接收緩沖區中沒有數據或者協議正在接收數 據,那么recv就一直等待,直到協議把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩沖中的數據copy到buf中(注意協議接收到的數據可能大于buf的長度,所以 在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的), recv函數返回其實際copy的字節數。如果recv在copy時出錯,那么它返回SOCKET_ERROR;如果recv函數在等待協議接收數據時網絡中斷了,那么它返回0。 默認 socket 是阻塞的 解阻塞與非阻塞recv返回值沒有區分,都是 0 出錯 =0 連接關閉 0 接收到數據大小,
特別:返回值0時并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接是正常的,繼續接收。只是阻塞模式下recv會阻塞著接收數據,非阻塞模式下如果沒有數據會返回,不會阻塞著讀,因此需要循環讀取)。
返回說明: 成功執行時,返回接收到的字節數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值 EAGAIN:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時 EBADF:sock不是有效的描述詞 ECONNREFUSE:遠程主機阻絕網絡連接 EFAULT:內存空間訪問出錯 EINTR:操作被信號中斷 EINVAL:參數無效 ENOMEM:內存不足 ENOTCONN:與面向連接關聯的套接字尚未被連接上 ENOTSOCK:sock索引的不是套接字 當返回值是0時,為正常關閉連接;
思考:當對側沒有send,即本側的套接字s的接收緩沖區無數據,返回值是什么(EAGAIN,原因為超時,待測)
文章題目:c語言recv函數的用法,c語言ret函數
標題鏈接:http://m.newbst.com/article14/hseege.html
成都網站建設公司_創新互聯,為您提供移動網站建設、網站維護、外貿建站、云服務器、虛擬主機、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯