recvfrom

recvfrom

數學定義
recvfrom函數(經socket接收數據):函數原型:ssize_trecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,socket_t*fromlen),ssize_t相當于int,socket_t相當于int,這裡用這個名字為的是提高代碼的自說明性。函數說明:recvfrom()用來接收遠程主機經指定的socket傳來的數據,并把數據傳到由參數buf指向的内存空間,參數len為可接收數據的最大長度,參數flags一般設0,其他數值定義參考recv(),參數from用來指定欲傳送的網絡地址,結構sockaddr請參考bind()函數,參數fromlen為sockaddr的結構長度,
    中文名:接收函數 外文名:recvfrom 适用領域: 所屬學科: 函數原型:ssize_t recvfrom 參數:sockfd 返回值:recv,recvmsg

參數

sockfd:标識一個已連接套接口的描述字。

buf:接收數據緩沖區。

len:緩沖區長度。

flags:調用操作方式。是以下一個或者多個标志的組合體,可通過or操作連在一起:

MSG_DONTWAIT:操作不會被阻塞。

MSG_ERRQUEUE:指示應該從套接字的錯誤隊列上接收錯誤值,依據不同的協議,錯誤值以某種輔佐性消息的方式傳遞進來,使用者應該提供足夠大的緩沖區。導緻錯誤的原封包通過msg_iovec作為一般的數據來傳遞。導緻錯誤的數據報原目标地址作為msg_name被提供。錯誤以sock_extended_err結構形态被使用,定義如下

#defineSO_EE_ORIGIN_NONE0

#defineSO_EE_ORIGIN_LOCAL1

#defineSO_EE_ORIGIN_ICMP2

#defineSO_EE_ORIGIN_ICMP63

structsock_extended_err

{

u_int32_tee_errno,

u_int8_tee_origin,

u_int8_tee_type,

u_int8_tee_code,

u_int8_tee_pad,

u_int32_tee_info,

u_int32_tee_data,},

MSG_PEEK:指示數據接收後,在接收隊列中保留原數據,不将其删除,随後的讀操作還可以接收相同的數據。

MSG_TRUNC:返回封包的實際長度,即使它比所提供的緩沖區更長,隻對packet套接字有效。

MSG_WAITALL:要求阻塞操作,直到請求得到完整的滿足。然而,如果捕捉到信号,錯誤或者連接斷開發生,或者下次被接收的數據類型不同,仍會返回少于請求量的數據。

MSG_EOR:指示記錄的結束,返回的數據完成一個記錄。

MSG_TRUNC:指明數據報尾部數據已被丢棄,因為它比所提供的緩沖區需要更多的空間。

MSG_CTRUNC:指明由于緩沖區空間不足,一些控制數據已被丢棄。

MSG_OOB:指示接收到out-of-band數據(即需要優先處理的數據)。

MSG_ERRQUEUE:指示除了來自套接字錯誤隊列的錯誤外,沒有接收到其它數據。

from:(可選)指針,指向裝有源地址的緩沖區。

fromlen:(可選)指針,指向from緩沖區長度值。

返回值

如果正确接收返回接收到的字節數,失敗返回-1,

相關函數recv,recvmsg,send,sendto,socket

函數說明:recvfrom()用來接收遠程主機經指定的socket傳來的數據,并把數據傳到由參數buf指向的内存空間,參數len為可接收數據的最大長度,參數flags一般設0,其他數值定義參考recv(),參數from用來指定欲傳送的網絡地址,結構sockaddr請參考bind()函數,參數fromlen為sockaddr的結構長度,相關函數:recv, recvmsg, send, sendto, socket

返回值:成功則返回接收到的字符數,失敗返回-1,

錯誤代碼

EBADF參數s非合法的socket處理代碼

EFAULT參數中有一指針指向無法存取的内存空間。

ENOTSOCK參數s為一文件描述詞,非socket。

EINTR被信号所中斷。

EAGAIN此動作會令進程阻斷,但參數s的socket為不可阻斷。

ENOBUFS系統的緩沖内存不足

ENOMEM核心内存不足

EINVAL傳給系統調用的參數不正确。

範例

,*利用socket的UDPclient

此程序會連線UDPserver,并将鍵盤輸入的字符串傳給server。

UDPserver範例請參考sendto

#include

#include

#include

#include

#include

#include

#include

#definePORT2345

#defineSERVER_IP“127,0,0,1”

main()

ints,len,

structsockaddr_inaddr,

intaddr_len=sizeof(structsockaddr_in),

charbuffer,

,*建立socket*,

if((s=socket(AF_INET,SOCK_DGRAM,0))<0){

perror(“socket”),

exit(1),

,*填寫sockaddr_in*,

bzero(&addr,sizeof(addr)),

addr,sin_family=AF_INET,

addr,sin_port=htons(PORT),

addr,sin_addr,s_addr=inet_addr(SERVER_IP),

while(1){

bzero(buffer,sizeof(buffer)),

,*從标準輸入設備取得字符串*,

len=read(STDIN_FILENO,buffer,sizeof(buffer)),

,*将字符串傳送給server端*,

sendto(s,buffer,len,0,(structsockaddr*)&addr,addr_len),

,*接收server端返回的字符串*,

len=recvfrom(s,buffer,sizeof(buffer),0,(structsockaddr*)&addr,&addr_len),

printf(“receive:%s”,buffer),

執行(先執行udpserver再執行udpclient)

hello,*從鍵盤輸入字符串*,

receive:hello,*server端返回來的字符串*,

相關詞條

相關搜索

其它詞條