有一些點,我不明白select(),我希望你的指導。當我讀到這個功能,我發現討論關於select()
的select()函數爲您提供了一種方法來同時檢查 多個插槽),看看他們是否有數據等待的recv(d,或如果 您可以發送()數據給他們沒有阻塞,或者如果發生了一些異常 。
1)我明白的第一件事是該函數可以並行檢查套接字。現在想象一下sock1和sock2在同一時間接收數據包(來自sock1的數據包1和來自sock2的數據包2),並且必須對每個數據包進行一些處理。並行處理數據包?或者packet1會處理數據包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)關於選擇其它疑問,我已經涉及阻塞和非阻塞。 阻塞的意義究竟是什麼?這是否意味着程序停止在這條線上直到事件發生? 我認爲,爲了避免阻塞,可以使用timeval tv或fcntl()。還有更好的方法嗎?
在此先感謝