Linuxのrecvfromを非ブロッキングモードに設定するにはどうすればいいですか?

Linuxでは、recvfrom関数を非ブロッキングにするには、ソケットの属性を設定します。その方法は次のとおりです。1. ソケットの作成:

  int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

ソケットをノンブロッキングモードに設定

  int flags = fcntl(sockfd, F_GETFL, 0);

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);


非ブロッキングモードで動作するrecvfrom関数を使ってデータを受信します。

  char buffer[1024];

 

struct sockaddr_in client_addr;

 

socklen_t addr_len = sizeof(client_addr);

 

ssize_t num_bytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr,

 

&addr_len);


非ブロッキングモードの場合、recvfrom関数はデータの読み込み可否にかかわらず、ただちに返ります。データの読み込みがなければ、recvfrom関数は-1を返し、errnoはEAGAINまたはEWOULDBLOCKに設定されます。

bannerAds