網絡編程I/O函數介紹
來源:程序員人生 發布時間:2014-11-11 09:07:32 閱讀次數:2143次
read和write
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
參數:
buf:數據緩沖區,用于保存要從fd讀取或寫入的數據
count:輸入/寫入的數據最大字節數。(實際讀取或寫入的數據大小可能小于count)
返回值:
正常情況下返回讀取或寫入的真實的數據大小
返回0表示沒有數據被讀取到或寫入
⑴:函數調用毛病,errno值會被設置
readv和writev
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
相當于寫數據塊,并且可以制定數據塊的大小。
具體參考結構體struct iovec
send和recv
send和recv用于已建立連接的套接字通訊(UDP也有已連接的)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
flags 參數有以下的選擇:
MSG_DONTROUTE 勿將數據路由出本地網絡
MSG_DONTWAIT 允許非阻塞操作(等價于使用O_NONBLOCK)
MSG_EOR 如果協議支持,此為記錄結束
MSG_OOB 如果協議支持,發送帶外數據
MSG_NOSIGNAL 制止向系統發送異常信息
返回值
成功則返回實際傳送出去的字符數,失敗返回-1,毛病緣由存于errno 中。
recvfrom和sendto
原型
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
參數:
前面3個參數與read/write的3個參數類似,分別表示文件描寫符,數據緩沖區,最大讀取/寫入的數據大小
flags: 與send和recv1樣
src_addr:數據報發送者的協議地址的套接字地址結構
dest_addr:數據報要發送的目的地協議地址的套接字地址結構
addrlen,前1個參數的大小
返回值:
真正發送/接收的數據的大小
注意點:
我們可以看到,sendto和recvfrom函數均含有1個跟對端地址相干的參數(src_addr, dest_addr),因此可以再沒有建立連接的網絡通訊(UDP)中使用。這里sockfd只需要通過socket()進行創建,而不1定需要connect()進行連接。(不需要不代表不能,后面進1步介紹)
在1些時候,我們需要使用connect()為UDP通訊建立連接,(由于UDP是不可靠的,但我們卻想要將異步毛病返回)。這里的連接于TCP的連接時不1樣的。UDP的connect相當于TCP的connect的重載,它沒有3次握手的進程,更偏向于綁定的概念。UDPconnect()只是將套接字與IP地址進行連接綁定。
使用有連接的UDP通訊時,我們1般不適用sendto和recvfrom,而使用send和recv等函數。如非要使用sendto和recvfrom,則src_addr,dest_addr,參數必須為NULL,len必須為0
recvmsg和sendmsg
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
類似于readv和writev。參考msghdr結構體
筆記:
如果套接口為SOCK_STREAM類型,并且遠端“優雅”地中斷了連接(發送端send后立即關閉套接字,還沒測試),那末recv()1個數據也不讀取,立即返回。如果立即被強迫中斷,那末recv()將以WSAECONNRESET毛病失敗返回。flags參數和套接字選項都會影響到網絡I/O函數的調用方式。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈