如何检测我是否有要从套接字读取的内容?(c++)

How to detect if i have something to read from a socket ? (c++)

本文关键字:套接字 读取 c++ 何检测 检测 是否      更新时间:2023-10-16

我正试图在一定时间内从客户那里得到答案。我该怎么做?我的意思是我有代码

unsigned secondsElapsed = 0;
while(secondsElapsed <= TIMER){
char tBuffer[32];
if (recv(clientSocket, tBuffer, sizeof(tBuffer), MSG_PEEK | MSG_DONTWAIT) == 0){
myPlayer->dcPlayer();
\ More stuff to do if player is dissconected
\ But if is not dc, and is typing, how can i check my socket to see
\ if i have an answer there to read, else i`ll increment 
\ secondsElapsed until is equal to TIMER or until i get an answer    
\ from my client.
usleep(1000000);
secondsElapsed++;
}

所以,问题是:我如何检查我的客户是否给我发了答案?如果我尝试阅读,那么我的程序将被卡住,我将无法增加秒。

这里有很多选项。首先,您可能使用非阻塞套接字(通常不是很好的解决方案)。更好的选择是使用操作系统提供的轮询/异步通知机制-例如,在*Nix上,用户可以从selectpollepoll中进行选择,而Windows有自己的异步事件通知API,例如I/O完成端口,如下所述:https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365198(v=vs.85).aspx

在调用recv()(或read())读取数据之前,您可以使用select()(或*Nix系统上的pselect()(e)poll())来知道数据何时可用,例如:

char tBuffer[32];
float secondsElapsed = 0;
clock_t start = clock(), end;
do {
fd_set rfd;
FD_ZERO(&rfd);
FD_SET(clientSocket, &rfd);
struct timeval timeout;
timeout.tv_sec = TIMER - secondsElapsed;
timeout.tv_usec = 0;
int ret = select(clientSocket+1, &rfd, NULL, NULL, &timeout);
if (ret == -1) {
myPlayer->dcPlayer();
break;
}
if (ret == 0) {
// timeout ...
break;
}
// data available, read it...
ret = recv(clientSocket, tBuffer, sizeof(tBuffer), 0);
if (ret <= 0) {
myPlayer->dcPlayer();
break;
}
// use tBuffer up to ret number of bytes...
if (... /*no more data is expected*/) {
break;
}
end = clock();
secondsElapsed = end - start; // time difference is now a float
seconds /= CLOCKS_PER_SEC; // this division is now floating point
}
while (secondsElapsed <= TIMER);