先看一下這三個函數的聲明:
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,表示對端已經關閉。
函數實現: