當前位置:首頁 » 編程語言 » c語言recv函數的用法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言recv函數的用法

發布時間: 2022-08-28 06:19:26

❶ recv函數返回什麼值

recv函數返回其實際的位元組數,如果recv在時出錯,那麼它返回SOCKET_ERROR。如果recv函數在等待協議接收數據時網路中斷了,那麼它返回0。

擴展閱讀,linux recv函數詳解:

1 #include <sys/socket.h>
2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
recv 的前3個參數等同於read函數。

flags參數值為0或:

flags
說明
recv
send

MSG_DONTWAIT
僅本操作非阻塞

MSG_OOB 發送或接收帶外數據

MSG_PEEK
窺看外來消息

MSG_WAITALL
等待所有數據

recv函數解析:

sockfd: 接收端套接字描述符

buff: 用來存放recv函數接收到的數據的緩沖區

nbytes: 指明buff的長度

flags: 一般置為0

1) recv先等待s的發送緩沖區的數據被協議傳送完畢,如果協議在傳送sock的發送緩沖區中的數據時出現網路錯誤,那麼recv函數返回SOCKET_ERROR

2)
如果套接字sockfd的發送緩沖區中沒有數據或者數據被協議成功發送完畢後,recv先檢查套接字sockfd的接收緩沖區,如果sockfd的接收緩
沖區中沒有數據或者協議正在接收數據,那麼recv就一起等待,直到把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩沖區中的數據
到buff中(注意協議接收到的數據可能大於buff的長度,所以在這種情況下要調用幾次recv函數才能把sockfd的接收緩沖區中的數據
完。recv函數僅僅是數據,真正的接收數據是協議來完成的)

3) recv函數返回其實際的位元組數,如果recv在時出錯,那麼它返回SOCKET_ERROR。如果recv函數在等待協議接收數據時網路中斷了,那麼它返回0。

4) 在unix系統下,如果recv函數在等待協議接收數據時網路斷開了,那麼調用 recv的進程會接收到一個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中死循環,可以用以上方法判斷接收結束。

c語言 關於socket中的recv()函數 讀數據的時候需要考慮的是當recv()返回的大小如果等於請求的大小

那是應該你的緩沖區不夠大,recv只會最多返回緩存區大小的數據,否則緩沖區不就溢出了嗎?

❹ C語言中SOCKET關於send和recv的問題,不懂別亂貼

說實在的這個問題非常簡單,不過你習慣太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事實。
否則還可能有Socket問題。
如果是linux,strace一下就知道什麼問題了。
Windows的也很簡單。

前面的明顯不正確,send如果是TCP,(UDP 不應該用send),send返回時,消息已經發出了。

❺ c語言如何檢測網路是否連接

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的接收緩沖中的數據到buf中(注意協議接收到的數據可能大於buf的長度,所以 在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據完。recv函數僅僅是數據,真正的接收數據是協議來完成的), recv函數返回其實際的位元組數。如果recv在時出錯,那麼它返回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語言,網路編程,伺服器接收客戶端1的信息發送給客戶端2

char
buff2[1024*10];
int
receiveLen;
/*調用accept函數,等待客戶端的連接*/
client_fd=accept(sockfd,(struct
sockaddr
*)&client_sockaddr,&sin_size
/*調用recv函數接收客戶端的請求*/
recvbytes=recv(client_fd,buf,BUFFER_SIZE,0)
typedef
int
(WINAPI
ICEPUB_TCPSENDANDRECEIVETEXT)(char
*sendBuff,
int
sendBuffLen,char
*recvBuff,int
recvMaxLen,char*
serverIP,int
serverPort);
ICEPUB_TCPSENDANDRECEIVETEXT
*icePub_tcpSendAndReceiveText
=
0;
HINSTANCE

hDLLDrv
=
LoadLibrary
("icePubDll.dll");
if(hDLLDrv)
{
icePub_tcpSendAndReceiveText=(ICEPUB_TCPSENDANDRECEIVETEXT
*)
GetProcAddress
(hDLLDrv,"icePub_tcpSendAndReceiveText");
}
if(icePub_tcpSendAndReceiveText)
receiveLen=icePub_tcpSendAndReceiveText(buf,recvbytes),buff2,1024*10,"192.168.1.2",8000);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox
(buff2);

❼ c語言的recv()非阻塞方法怎麼弄哦

需要將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));

❽ recv()函數怎麼一次接收send()三次發送的數據(c語言實現)。

不可能知道伺服器是否已經發送完畢,因為你發送的沒有數據協議的格式,你可以讓發送方與接收方定個協議。其實你可以在recv時加個參數,讓它只是看看有沒有數據到達,recv最後那個參數設為MSG_OOB就可以,當發現有數據到時,你先Sleep一下,至於多長時間就要看實際情況,一般幾十個毫秒就絕對夠了,然後,你再recv一下,這次最後那個參數為MSG_WAITALL就可以,這樣就一次性接收完畢

❾ C語言winsocket編程recv函數接收數據問題

不對,除非你接收前把緩沖區置0 用RtlZeroMemory函數。
你可以在接收那裡加判斷啊,滿足你的條件時繼續執行,執行完成再重置緩沖區