Posted to tcl by Napier at Sun Feb 14 04:36:36 GMT 2016view raw

  1. proc ConnectSocket {ip port} {
  2. puts "Open Socket"
  3. set socketID [::socket $ip $port ]
  4. puts "Listen for Events"
  5. chan configure $socketID \
  6. -buffering none \
  7. -translation auto \
  8. -blocking false \
  9. -encoding "utf-8"
  10.  
  11. set data "Hey Coroutine!"
  12. set count 0
  13. set future [ coroutine subroutine[incr count] apply {data {
  14. puts "Procedure Called!"
  15. set myVar 0
  16.  
  17. set socketID [ yield [info coroutine] ]
  18. while {true} {
  19. puts "Start While Loop"
  20. puts "Future Executed!"
  21. puts "Data Provided is $data"
  22. puts "Invoked: $myVar times"
  23. switch -- $myVar {
  24. 0 {
  25. puts "Process One! We login"
  26. puts $socketID "lutron\r\n"
  27. }
  28. 1 {
  29. puts "Process Two! We send password"
  30. puts $socketID "integration\r\n"
  31. }
  32. }
  33. set socketID [ yield [incr myVar] ]
  34. }
  35. }} $data ]
  36.  
  37.  
  38. chan event $socketID writable [ coroutine write${socketID} apply {socketID {
  39. yield [info coroutine]
  40. puts "Socket is still open!"
  41. chan event $socketID writable {}
  42. set context [info frame [info frame]]
  43. puts "Done Evaluating Writable Event"
  44.  
  45. }} $socketID ]
  46.  
  47. puts "Original Procedure Continues!"
  48.  
  49. puts "... Next Event Saga Here ... "
  50.  
  51. chan event $socketID readable [ coroutine read${socketID} apply { {socketID future} {
  52.  
  53. yield [info coroutine]
  54. try {
  55. while {[gets $socketID line] >= 0} {
  56. puts "Received"
  57. puts $line
  58. }
  59. puts "Continue"
  60. set data [read -nonewline $socketID]
  61. puts "Read Result"
  62. puts $data
  63. } on error {result options} {
  64. puts "Uh-Oh!"
  65. puts $result
  66. puts $options
  67. } finally {
  68. puts "Call Future"
  69. set linesRead [ $future $socketID ]
  70.  
  71. puts "We have read $linesRead lines from the Socket"
  72.  
  73. #close $socketID
  74. }
  75.  
  76. }} $socketID $future ]
  77.  
  78. }