有一些点,我不明白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()。还有更好的方法吗?
在此先感谢