Re: OpenTransport behaviour under X
Re: OpenTransport behaviour under X
- Subject: Re: OpenTransport behaviour under X
- From: Marc Stibane <email@hidden>
- Date: Thu, 6 Nov 2003 23:42:56 +0100
>
> 1. send next command to RIP
>
> 2. start calling OTLook in a loop
>
> 3. RIP answers
>
> 4. OTLook keeps returning 0 instead of T_DATA, so my app hangs in that
>
> loop, never getting the answer.
>
>
For step 4, couldn't you set the endpoint non-blocking, then call OTRcv
>
in a loop until you've read as much data as you expect to get at that
>
point, then go back to blocking?
The problem is that the application was written for WinSocks, and calls
"select". The glue code uses OTLook to simulate the behaviour of "select"
- which doesn't want to read data, but only to find out whether new data
arrived.
Later the application calls "recv" to read that data.
int select(int ndfs, fd_set *readfds, fd_set *writefds, fd_set *exeptfds,
struct timeval *timeout) {
long millis;
int fd;
int rcnt=0, wcnt=0, ecnt=0, cnt;
static int timedout = 0;
UInt32 now = TickCount();
UInt32 expire = 0;
if (timeout) {
millis = timeout->tv_sec * 1000 + timeout->tv_usec/1000; // microseconds
// create timer task
//int selectTimerID = ::OTCreateTimerTask(selectTimer, &timedout);
// int selectTimerID = ::OTCreateTimerTask(0L, 0L);
// start timer
//OTScheduleTimerTask(selectTimerID, millis);
expire = now + (6*millis/100);
do {
size_t n = 0;
rcnt = wcnt = ecnt = 0;
for (fd = 0; fd < MAXFD && fd < ndfs; fd++) {
if (sockets[fd].ep != kOTInvalidEndpointRef) {
if (readfds && FD_ISSET(fd, readfds)) {
int state = myOTLook(sockets[fd].ep, false); // TODO this doesn't
work !!!
if (state & (T_ERROR|T_RESET|T_DISCONNECT|T_UDERR)) {
return -1;
}
if (state & T_DATA) {
rcnt++;
}
}
if (writefds && FD_ISSET(fd, writefds)) {
if (OTGetEndpointState(sockets[fd].ep) == T_DATAXFER) {
wcnt++;
}
}
if (exeptfds && FD_ISSET(fd, exeptfds)) {
/*
*/
}
}
}
if (rcnt || wcnt || ecnt) {
// kill timer
// OTCancelTimerTask(selectTimerID);
break;
}
// OTIdle();
now = TickCount();
} while (now <= expire && !timedout);
// kill timer
// OTDestroyTimerTask(selectTimerID);
timedout = 0; // reset for the next loop (it's "static")
} else {
// ParamText("\pselect called with timeout=nil!", nil, nil, nil);
// Alert(132, nil);
return -1;
}
if (rcnt) {
cnt = rcnt;
} else if (wcnt) {
cnt = wcnt;
} else if (ecnt) {
cnt = ecnt;
} else {
cnt = 0;
}
return cnt;
}
Marc Stibane
Fesh! email@hidden
Kurf|rstenstr. 154 tel +49-30-3990 2690
10785 Berlin, Germany mobil +49-173-6522 422
In a world without walls and fences,
who needs windows and gates?
_______________________________________________
macnetworkprog mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/macnetworkprog
Do not post admin requests to the list. They will be ignored.