Linux內核分析:recv、recvfrom、recvmsg函數實現


先看一下這三個函數的聲明:

1 #include <sys/types.h>
2 #include <sys/socket.h>
3 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
4 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
5 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

1、這個三個函數都是用來從一個socket接收消息的,不同之處在於recvfrom和recvmsg可以用在已經建立連接的socket,也可以用在沒有建立連接的socket,關於建立連接的socket,簡單來說就是有沒有調用connect,調用了bind的socket也可以。

2、addrlen是一個value-result參數,傳入函數之前初始化為src_addr的大小,返回之后存放src_addr實際大小。

3、三個函數的返回值都是成功讀取的消息的長度,如果一個消息的長度大於buffer的長度,多余的字節根據socket的類型可能會被丟棄(例如UDP)。

4、如果沒有消息可讀,這個三個函數會阻塞直到有數據;或者可以設置為非阻塞的,在這種情況下返回-1,同時errno被設置為EAGAIN或者EWOULDBLOCK。

5、如果返回值為0,表示對端已經關閉。

 函數實現:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM