From: <no...@so...> - 2001-03-31 18:47:34
|
Bugs item #219195, was updated on 2000-10-25 22:03 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=110894&aid=219195&group_id=10894 >Category: Channel Types Group: 8.0p2 Status: Open Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: async Tcl_OpenTcpClient failure remains undetected Initial Comment: OriginalBugID: 2713 Bug Version: 8.0p2 SubmitDate: '1999-09-10' LastModified: '1999-11-10' Severity: SER Status: Assigned Submitter: techsupp ChangedBy: hobbs OS: Solaris Machine: Other FixedDate: '2000-10-25' ClosedDate: '2000-10-25' Name: Hermann Hüni Comments: Is this bug already fixed in a later release of tcl? ReproducibleScript: static Tcl_Channel remoteServerChannel; int main() { /* * open client socket to remote server */ remoteServerChannel = Tcl_OpenTcpClient(/* interp */ NULL, /* port */ remoteServerPortNb, /* host */ remoteServer, /* myaddr */ NULL, /* myport */ 0, /* async */ 1); if (remoteServerChannel == NULL) { /* * tcp open has failed */ perror("Tcl_OpenTcpClient failed:"); exit(-1); } /* * register establishedEvent handler for this channel */ Tcl_CreateChannelHandler(remoteServerChannel, TCL_WRITABLE|TCL_EXCEPTION, establishedEvent, (ClientData)remoteServerChannel); } /* * socket connection established Event callback */ static void establishedEvent(ClientData clientData, int mask) { Tcl_Channel channel = (Tcl_Channel)clientData; { Tcl_DString optionString; Tcl_DStringInit(&optionString); { int success = Tcl_GetChannelOption(/* interp */ NULL, aChannel, /* optionName */ "-peername", &optionString); /* ... */ } } } ./myClient someHost undeployedPortNumber ObservedBehavior: In the following usage: ./myClient someHost undeployedPortNumber the Tcl_OpenTcpClient call does not return NULL and the establishedEvent callback is NEVER called. How can we get to know, that the socket connection will never succeed? Here is a real trace: bash$ ./myClient butler 799999 main; channel options are: /-blocking 1 -buffering line -buffersize 4096 -eofchar {{} {}} -translation {auto crlf} -sockname {0.0.0.0 0.0.0.0 0}/ We could check for -sockname not beeing {0.0.0.0 0.0.0.0 0} as a work around just after the the call to Tcl_OpenTcpClient() ? But the real place to check the success or failure should be in the establishedEvent() callback. Unfortunately, this callback does never occur. This seems to be a real bug. I am using tcl8.0p2 on Solaris 2.7. Democode is available uppon demand DesiredBehavior: The establishedEvent() callback should occur as it does, if we give an unreachable host. This should be tried again with 8.2.2, there have been many fixes in this area since 8.0p2. -- 11/10/1999 hobbs ---------------------------------------------------------------------- Comment By: Donal K. Fellows (dkf) Date: 2001-01-16 05:42 Message: Is it possible to open this socket in asynchronous mode (with the flag -async)? Then you can get a timeout quite simply using the [after] command, and you know (by watching for either the timer event or a writable fileevent) whether you've successfully connected or not. Hmm. Perhaps the -async option should note (via demo-code?) that any [fileevent writable] events defined on an async socket get fired when the connection is made... ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=110894&aid=219195&group_id=10894 |