recv send以及readv writev函式

2021-08-26 20:44:49 字數 3282 閱讀 4735

#include ssize_t recv(int sckfd,void *buff,size_t nbytes,int flags);

ssize_t send(int sckfd,const void *buff,size_t nbytes,int flags);

這兩個 函式類似標準的read和write函式,不過需要乙個額外的引數。

若成功則為讀入或寫出的位元組數,若出錯則為-1。

recv:另一端已關閉則返回0。

recv和send的前三個引數等同於read和write的3個引數。flags引數值或為0,或者為常量值的邏輯或,最常用的是:

flags

說明recv

send

msg_oob

傳送或接收帶外資料有有

msg_ppek

窺看外來訊息有無

recv和send只能用於套介面io,不能用於檔案io以及其它的io,而read、write可以用於任意的io

利用recv實現readline的功能,readline函式能夠實現按行讀取,直到遇到\n為止,說明這算是一條訊息。這也就能夠解決粘包問題

#include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

ssize_t readn(int fd,void *buf,size_t count)

else if(nread==0)

return count-nleft;

bufp+=nread;

nleft-=nread;

}return count;

} ssize_t writen(int fd,void *buf,size_t count)

else if(nwritten==0)

continue;

bufp+=nwritten;

nleft-=nwritten;

}return count;

}//去看客戶端的講解

ssize_t recv_peek(int sockfd,void *buf,size_t len)

}//去看客戶端的講解

ssize_t readline(int sockfd,void *buf,size_t maxline)

return -1;

}void do_service(int conn)

fputs(recvbuf,stdout);

writen(conn,recvbuf,strlen(recvbuf));

}}int main(void)

else

close(conn);

} return 0;

}

#include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

ssize_t readn(int fd,void *buf,size_t count)

else if(nread==0)

return count-nleft;

bufp+=nread;

nleft-=nread;

} return count;

}ssize_t writen(int fd,void *buf,size_t count)

else if(nwritten==0)

continue;

bufp+=nwritten;

nleft-=nwritten;

} return count;

}//這個函式能夠從套介面接收資料,通過msg_peek指定並不將資料從緩衝移除

//並不說一定要接收len個字元,只要偷看到資料就返回,沒有資料就阻塞

ssize_t recv_peek(int sockfd,void *buf,size_t len)}/*

實現的是按行讀取,也就是讀取知道遇到\n為止,這算是一條訊息

這種方法也可以解決粘包問題,通過\n表明了訊息與訊息之間的邊界

*///只能用於套介面,因為是用recv來實現的

//maxline:一行最大的位元組數,讀取的時候不是必須讀maxline,

//遇到\n就停止了,maxline只是最大限度

ssize_t readline(int sockfd,void *buf,size_t maxline)

//程式執行到這個位置就是出錯了

return -1;

}int main(void)

; char recvbuf[1024]=;

while(fgets(sendbuf,sizeof(sendbuf),stdin)!=null)

fputs(recvbuf,stdout);

memset(sendbuf,0,sizeof(sendbuf));

memset(recvbuf,0,sizeof(recvbuf));

} close(sock);

return 0;

}

readv和writev函式用於在一次函式呼叫中讀、寫多個非連續緩衝區。有時也將這兩個函式稱為散布讀和聚集寫。

#include ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);

ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);

兩個函式的返回值:若成功則返回已讀、寫的位元組數,若出錯則返回-1

struct iovec ;
iovec結構和緩衝區的關係:

writev以順序iov[0],iov[1]至iov[iovcnt-1]從緩衝區中聚集輸出資料。writev返回輸出的位元組總數,通常,它應等於所有緩衝區長度之和。

readv則將讀入的資料按上述同樣順序散布到緩衝區中。readv總是先填滿乙個緩衝區,然後再填寫下乙個。readv返回讀到的總位元組數。如果遇到檔案結尾,已無資料可讀,則返回0。

高階I O之readv和writev函式

readv和writev函式用於在一次函式呼叫中讀 寫多個非連續緩衝區。有時也將這兩個函式稱為散布讀 scatter read 和聚集寫 gather write include ssize t readv int filedes,const struct iovec iov,int iovcnt ...

recv send 阻塞和非阻塞

在 阻塞模式 下,send函式的過程是將應用程式請求傳送的資料拷貝到傳送快取中傳送就返回.但由於傳送快取的存在,表現為 如果傳送快取大小比請求傳送的大小要大,那麼send函式立即返回,同時向網路中傳送資料 否則,send會等待接收端對之前傳送資料的確認,以便騰出快取空間容納新的待傳送資料,再返回 接...

recv send 阻塞和非阻塞

int send socket s,const char far buf,int len,int flags 不論是客戶還是伺服器應用程式都用send函式來向tcp連線的另一端傳送資料。客戶程式一般用send函式向伺服器傳送請求,而伺服器則通常用send函式來向客戶程式傳送應答。該函式的第乙個引數指...