18,356
社区成员
发帖
与我相关
我的任务
分享
static int blockUntilReadable(UsageEnvironment& env,
int socket, struct timeval* timeout) {
int result = -1;
do {
fd_set rd_set;
FD_ZERO(&rd_set);
if (socket < 0) break;
FD_SET((unsigned) socket, &rd_set);
const unsigned numFds = socket+1;
result = select(numFds, &rd_set, NULL, NULL, timeout); //block here
if (timeout != NULL && result == 0) {
break; // this is OK - timeout occurred
} else if (result <= 0) {
#if defined(__WIN32__) || defined(_WIN32)
#else
if (errno == EINTR || errno == EAGAIN) continue;
#endif
socketErr(env, "select() error: ");
break;
}
if (!FD_ISSET(socket, &rd_set)) {
socketErr(env, "select() error - !FD_ISSET");
break;
}
} while (0);
return result;
}
int readSocket(UsageEnvironment& env,
int socket, unsigned char* buffer, unsigned bufferSize,
struct sockaddr_in& fromAddress,
struct timeval* timeout) {
int bytesRead = -1;
while(1)
{
int result;
result = blockUntilReadable(env, socket, timeout);
if(result > 0)
{
break;
}
if (timeout != NULL && result == 0)
{
bytesRead = 0;
break;
}
else if (timeout == NULL && result <= 0)
{
sleep(10); //break;
}
}
do {
unsigned int addressSize = sizeof fromAddress;
while(1)
{
bytesRead = recvfrom(socket, (void*)buffer, bufferSize, 0,
(struct sockaddr*)&fromAddress,
&addressSize);
if(bytesRead > 0) break; // added by lin
if(bytesRead == 0) break; // added by lin
}
....
]
return bytesRead;
}