UDP服務recvfrom函式設定非阻塞

2021-09-21 17:46:54 字數 1086 閱讀 6478

其實udp的非阻塞也可以理解成和tcp是一樣的,都是通過socket的屬性去做。

方法一:通過fcntl函式將套接字設定為非阻塞模式

方法二:通過套接字選項so_recvtimeo設定超時。

只是linux 下的情況

阻塞模式和非阻塞模式下send、sendto、recv、recvfrom的表現

在linux 下用fcntl 函式

//設定非阻塞

static void setnonblocking(int sockfd)

if (fcntl(sockfd, f_setfl, flag | o_nonblock) < 0)

}在windows 下用ioctlsocket

//設定非阻塞

static void setnonblocking(int sockfd)

}看看函式說明

定義函式:int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,int *fromlen);

函式說明:recvfrom()用來接收遠端主機經指定的socket 傳來的資料, 並把資料存到由引數buf 指向的記憶體空間, 引數len 為可接收資料的最大長度. 引數flags 一般設0, 其他數值定義請參考recvfrom(). 引數from 用來指定欲傳送的網路位址, 結構sockaddr 請參考bind(). 引數fromlen 為sockaddr 的結構長度.

返回值:成功則返回接收到的字元數, 失敗則返回-1, 錯誤原因存於errno 中.

利用返回值判斷接收情況,如果沒有接收到,返回為-1。

所以,接收情況的判斷需要利用recvfrom 的返回值。

不用上面那樣複雜,也可以直接用不阻塞標誌,如下:

ret=recvfrom(sockfd,recvbuff,recvbufflen,msg_dontwait,( struct sockaddr *) &cliaddr, &clientlen);   就是flags標誌不為0,而是msg_dontwait就變為不阻塞了。

多程序udp接收recvfrom返回 1原因分析

服務端 include include include include include include include define bufflen 1024 define server port 8888 define backlog 5 define pidnumb 2 static void ...

UDP相關函式

欲函式的詳細資訊,請參考 涉及兩個函式readfrom 和sendto 1 readfrom 原型 int recvfrom int sockfd.void buf,int len,unsigned int flags,struct sockaddr from,int fromlen 作用 通過so...

UDP簡單伺服器

udp簡單伺服器與客戶端 這裡用到了 recvfrom 表示接受來自何處的連線請求資訊 sendto 要向何處傳送 下面這段 是伺服器原始碼 下面主要用到 socket 建立udp協議的套接字 bind 繫結本機三元資訊 recvfrom 接收客戶端向本機伺服器傳送來得資訊 sendto 向客戶端傳...