select()について理解できない点がいくつかあります。私はこの機能について読むように、私が見つけたそのディスカッションabout select()
select()関数は、あなたに彼らは(recvをされるのを待っているデータを持っている場合)dを参照するには同時にチェック 複数のソケットへの道を与えますか の場合は、ブロックせずにデータを送信したり、例外がある場合は が発生します。
1)私が理解した最初のことは、この機能がソケットを並行してチェックできるということでした。今度はsock1とsock2が正確に同じ時刻にパケットを受け取ったとします(sock1からのpacket1とsock2からのpacket2)、各パケットに対して何らかの処理が必要であると考えてください。並列のパケットの処理ですか?またはパケット1が処理され、パケット2が処理されますか?
int rv = select(maxSd, &readfds, NULL, NULL, NULL);
if (rv == -1) {
perror("select"); // error occurred in select()
} else if (rv == 0) {
printf("Timeout occurred! No data after 10.5 seconds.\n");
} else {
// one or both of the descriptors have data
if (FD_ISSET(sock1, &readfds)) {
printf("socket %i RECEIVED A PACKET \n", sock1);
recvlen = recvfrom(sock1, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr1, &addrlen1);
if (recvlen > 0) {
buf[recvlen] = 0;
printf("received message: \"%s\" (%d bytes)\n", buf, recvlen);
Packet mp;
mp.de_packet((unsigned char *)buf,recvlen);
}
else {
printf("uh oh - something went wrong!\n");
}
}
if (FD_ISSET(sock2, &readfds)) {
printf("socket %i RECEIVED A PACKET \n", sock2);
recvlen2 = recvfrom(sock2, buf2, BUFSIZE, 0, (struct sockaddr *)&remaddr2, &addrlen2);
if (recvlen2 > 0) {
buf[recvlen2] = 0;
printf("received message2: \"%s\" (%d bytes)\n", buf2, recvlen2);
Packet mp;
mp.de_packet((unsigned char *)buf,recvlen);
}
else
printf("uh oh - something went wrong2!\n");
}
}
2)iは、ブロッキングと非ブロッキングに関連していることを選択についての他の疑い(以下のコードの例のために)。 ブロックの意味はなんですか?イベントが発生するまでプログラムがこの行で停止することを意味しますか? 私はブロックすることを避けるために、timeval tvまたはfcntl()を使用することが可能だと思います。もっと良い方法がありますか?選択の復帰時に、事前