int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size) { OTFlags flags ; OTResult res ; OTByteCount sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( size > (int)sz ) size = sz ; res = OTRcv( socket->m_endpoint , buffer , size , &flags ) ; if ( res < 0 ) { return -1 ; } // we simulate another read event if there are still bytes if ( socket->m_takesEvents ) { OTByteCount sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( sz > 0 ) { socket->m_detected |= GSOCK_INPUT_FLAG ; (socket->m_cbacks[GSOCK_INPUT])(socket, GSOCK_INPUT, socket->m_data[GSOCK_INPUT]); } } return res ; }
PRInt32 _MD_socketavailable(PRFileDesc *fd) { PRInt32 osfd = fd->secret->md.osfd; OSStatus err; EndpointRef endpoint = (EndpointRef) osfd; size_t bytes; if (endpoint == NULL) { err = kEBADFErr; goto ErrorExit; } bytes = 0; err = OTCountDataBytes(endpoint, &bytes); if ((err == kOTLookErr) || // Not really errors, we just need to do a read, (err == kOTNoDataErr)) // or thereÕs nothing there. err = kOTNoError; if (err != kOTNoError) goto ErrorExit; return bytes; ErrorExit: macsock_map_error(err); return -1; }
/* _GSocket_Input_Timeout: * For blocking sockets, wait until data is available or * until timeout ellapses. */ GSocketError _GSocket_Input_Timeout(GSocket *socket) { if ( !socket->m_non_blocking ) { UnsignedWide now , start ; short formerTakesEvents = socket->m_takesEvents ; Microseconds(&start); now = start ; socket->m_takesEvents = FALSE ; while( (now.hi * 4294967296.0 + now.lo) - (start.hi * 4294967296.0 + start.lo) < socket->m_timeout * 1000.0 ) { OTResult state ; OTByteCount sz = 0 ; state = OTGetEndpointState(socket->m_endpoint); OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( state == T_INCON || sz > 0 ) { socket->m_takesEvents = formerTakesEvents ; return GSOCK_NOERROR; } Microseconds(&now); } socket->m_takesEvents = formerTakesEvents ; socket->m_error = GSOCK_TIMEDOUT; return GSOCK_TIMEDOUT; } return GSOCK_NOERROR; }
void _GSocket_Enable_Events(GSocket *socket) { if ( socket->m_takesEvents ) return ; { OTResult state ; socket->m_takesEvents = TRUE ; state = OTGetEndpointState(socket->m_endpoint); { OTByteCount sz = 0 ; OTCountDataBytes( socket->m_endpoint , &sz ) ; if ( state == T_INCON || sz > 0 ) { socket->m_detected |= GSOCK_INPUT_FLAG ; (socket->m_cbacks[GSOCK_INPUT])(socket, GSOCK_INPUT, socket->m_data[GSOCK_INPUT]); } } { if ( state == T_DATAXFER || state == T_INREL ) { socket->m_detected |=GSOCK_OUTPUT_FLAG ; (socket->m_cbacks[GSOCK_OUTPUT])(socket, GSOCK_OUTPUT, socket->m_data[GSOCK_OUTPUT]); } } } }
int SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout) { Uint32 stop; int numReady; /* Loop, polling the network devices */ stop = SDL_GetTicks() + timeout; do { OTResult status; size_t numBytes; int i; numReady = 0; for (i = set->numsockets-1;i >= 0;--i) { status = OTLook( set->sockets[i]->channel ); if( status > 0 ) { switch( status ) { case T_UDERR: OTRcvUDErr( set->sockets[i]->channel , nil); break; case T_DISCONNECT: OTRcvDisconnect( set->sockets[i]->channel, nil ); break; case T_ORDREL: OTRcvOrderlyDisconnect(set->sockets[i]->channel ); break; case T_CONNECT: OTRcvConnect( set->sockets[i]->channel, nil ); break; default: set->sockets[i]->ready = 1; ++numReady; } } else if( OTCountDataBytes(set->sockets[i]->channel, &numBytes ) != kOTNoDataErr ) { set->sockets[i]->ready = 1; ++numReady; } else set->sockets[i]->ready = 0; } } while (!numReady && (SDL_GetTicks() < stop)); return(numReady); }
void browse_chuukei() { #ifndef MACINTOSH fd_set fdset; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = WAIT; FD_ZERO(&fdset); FD_SET(sd, &fdset); Term_clear(); Term_fresh(); Term_xtra(TERM_XTRA_REACT, 0); while (1) { fd_set tmp_fdset; struct timeval tmp_tv; if (flush_ringbuf_client()) continue; tmp_fdset = fdset; tmp_tv = tv; /* ソケットにデータが来ているかどうか調べる */ select(sd+1, &tmp_fdset, (fd_set *)NULL, (fd_set *)NULL, &tmp_tv); if (FD_ISSET(sd, &tmp_fdset) == 0) { Term_xtra(TERM_XTRA_FLUSH, 0); continue; } if (read_sock() < 0) { chuukei_client = FALSE; } /* 接続が切れた状態で書くべきデータがなくなっていたら終了 */ if (!chuukei_client && fresh_queue.next == fresh_queue.tail ) break; } #else Term_clear(); Term_fresh(); Term_xtra(TERM_XTRA_REACT, 0); while (1) { UInt32 unreadData = 0; int n; if (flush_ringbuf_client()) continue; /* ソケットにデータが来ているかどうか調べる */ OTCountDataBytes(ep, &unreadData); if(unreadData <= 0 ){ Term_xtra(TERM_XTRA_FLUSH, 0); continue; } if (read_sock() < 0) { chuukei_client = FALSE; } /* 接続が切れた状態で書くべきデータがなくなっていたら終了 */ if (!chuukei_client && fresh_queue.next == fresh_queue.tail ) break; } #endif /*MACINTOSH*/ }