IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tcl/Tk Discussion :

Socket interdite en écriture


Sujet :

Tcl/Tk

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut Socket interdite en écriture
    Bonjour,

    J'ai créé un client et un serveur; le client se connecte bien au serveur et lui envoie bien les données, mais maintenant j'aimerais que le serveur envoie lui aussi des données au client et quand j'essaie de faire ça, j'ai l'erreur suivante : "channel "sock4" wasn't opened for writing"

    Quelqu'un peut-il m'aider ??

    Je donne le code au cas où...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    #!/usr/local/bin/wish
     
    # ###############
    #
    # server side
    #
    # ###############
     
    variable channel
     
    #----------------------------------------
    # client connection
    #----------------------------------------
    proc server {channel host port} \
    {
    	# save client info
        set ::($channel:host) $host
        set ::($channel:port) $port
        # log
        log "<opened>\n"
        set rc [catch \
        {
        	# set call back on reading
          	fileevent $channel readable [list input $channel]
        } msg]
        if {$rc == 1} \
        {
          	# i/o error -> log
          	log server ***$msg
        }
    }
    #----------------------------------------
     
     
    #----------------------------------------
    # client e/s
    #----------------------------------------
    proc input {channel} \
    {
    	if {[eof $channel]} \
        {
        	# client closed -> log & close
          	log $channel <closed>
         	catch { close $channel }
        } \
        else \
        {
          	# receiving
          	set rc [catch { set count [gets $channel data] } msg]
          	if {$rc == 1} \
          	{
            	# i/o error -> log & close
            	log ***$msg
            	catch { close $channel }
          	} \
          	elseif {$count == -1} \
          	{
            	# client closed -> log & close
            	log <closed>
            	catch { close $channel }
          	} \
          	else \
          	{
            	# got data -> do some thing
            	log $data
          	}
        }
    }
    #----------------------------------------
     
    #----------------------------------------
    # sending data on the socket
    #----------------------------------------
    proc output {channel data} \
    {
    	set rc [catch \
        {
        	puts $channel "$data"
          	flush $channel
        } msg]
        if {$rc == 1} { log $msg }
    }
    #----------------------------------------
     
    #----------------------------------------
    # Send command to the client
    #----------------------------------------
    proc sendCommand {} \
    { 
    	variable channel
     
    	if {[eof $channel]} \
        {
        	# client closed -> log & close
          	log $channel <closed>
         	catch { close $channel }
        } \
        else \
        {
        	set command [.fra1.frarec.txt1scrb.txtrec get 1.0 end]
    		puts $command
    		output $channel $command
    	}
    }
    #----------------------------------------
     
    #----------------------------------------
    # log
    #----------------------------------------
    proc log {msg} \
    { 
    	puts -nonewline "$msg" 
    	.fra1.frarec.txt1scrb.txtrec insert 200.0 $msg
    	.fra1.frarec.txt1scrb.txtrec see end
    }
    #----------------------------------------
     
     
    # ===================
    # start
    # ===================
    #----------------------------------------
    # open socket
    #----------------------------------------
    catch { console show }
    catch { wm protocol . WM_DELETE_WINDOW exit }
    set port 6000 ;# 0 if no known free port
    set rc [catch \
    {
    	set channel [socket -server server $port]
        if {$port == 0} \
        {
        	set port [lindex [fconfigure $channel -sockname] end]
          	puts "--> server port: $port"
        }
    } msg]
    if {$rc == 1} \
    {
    	log "<exiting>\n***$msg"
        exit
    }
    set (server:host) server
    set (server:port) $port
     
     
     
     
     
    #----------------------------------------
    #frame principale
    frame .framain -relief flat -bd 1 -height 800 -width 800
    pack configure .framain
    #----------------------------------------
    #frame secondaire fra1
    frame .fra1 -relief flat -borderwidth 1
    #----------------------------------------
    #frame reception avec bouton et texte avec scroll bar
    frame .fra1.frarec -relief flat -borderwidth 1
    frame .fra1.frarec.txt1scrb -bg white
    text .fra1.frarec.txt1scrb.txtrec -width 97 -height 52 -fg #000000 -bg #ffffff -font "Tahoma 10 normal" -yscrollcommand " .fra1.frarec.txt1scrb.scrbrec set "
    scrollbar .fra1.frarec.txt1scrb.scrbrec -command " .fra1.frarec.txt1scrb.txtrec yview "
    pack configure .fra1.frarec.txt1scrb.scrbrec -side right -fill y
    pack configure .fra1.frarec.txt1scrb.txtrec -side left
    pack configure .fra1.frarec.txt1scrb -side top -expand 0 -fill none 
    bind .fra1.frarec.txt1scrb.txtrec <KeyPress-Return> {sendCommand}
    #----------------------------------------
    #compilation fenetres
    pack configure .fra1.frarec -side top -expand 0 -fill none 
    place configure .fra1 -x 0 -y 0
    #---------------------------------------
     
    # ===================

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #!/usr/local/bin/wish
     
    # ######################################## #
    # ######################################## #
    # #######     client side       ########## #
    # ######################################## #
    # ######################################## #
     
     
     
    #########################################
    #            Serial                     #
    #########################################
    #----------------------------------------
    # Configure and open the serial port
    #----------------------------------------
    proc openSerial { } {
    	set serialPort [open /dev/ttyUSB0]
    	fconfigure $serialPort -mode "115200,n,8,1"
    	fconfigure $serialPort -blocking 0 -buffering none
    	return $serialPort
    }
    #----------------------------------------
     
     
    #########################################
    #            Socket                     #
    #########################################
    #----------------------------------------
    # sending data on the socket
    #----------------------------------------
    proc send:data {channel data} \
    {
    	set rc [catch \
        {
        	puts $channel "$data"
          	flush $channel
        } msg]
        if {$rc == 1} { log $msg }
    }
    #----------------------------------------
     
    #----------------------------------------
    # close the socket
    #----------------------------------------
    proc close:exit {channel} \
    {
    	close $channel
        exit
    }
    #----------------------------------------
     
    #----------------------------------------
    # log
    #----------------------------------------
    proc log {msg} { puts "$::host:$::port: ***$msg" }
    #----------------------------------------
     
     
    # ===================
    # start
    # ===================
     
    #----------------------------------------
    # open socket
    #----------------------------------------
    set host localhost
    set port 6000
    set rc [catch { set channel [socket $host $port] } msg]
    if {$rc == 1} { log $msg; exit }
     
    #----------------------------------------
    # open serial
    #----------------------------------------
    set serialPort [openSerial]
     
    #----------------------------------------
    # get data from serial port and 
    # send it on the socket
    #----------------------------------------
    while {1} \
    {
    	set data [read $serialPort 1]
    	set byteSize [string bytelength $data]
    	if { $byteSize == 1 } {
    		send:data $channel $data
    		puts -nonewline "$data"
    	} 
    }
     
    #----------------------------------------
    # enter event loop
    #----------------------------------------
    # vwait forever
    # ===================
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ton problème vient de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc openSerial { } {
    	set serialPort [open /dev/ttyUSB0]
    	...
    Selon la documentation de open, lorsque tu ne précises pas de mode, tu ouvres en lecture seulement, donc tu ne pourras pas écrire dans ton port.

    Pour ouvrir en lecture-écriture tu dois utiliser le mode r+, w+ ou a+ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc openSerial { } {
    	set serialPort [open /dev/ttyUSB0 r+]
    	...
    Et vu ce que tu es en train d'écrire, vas voir cette page http://wfr.tcl.tk/1592 tu vas y trouver plein d'inspiration.

    Ciao,

    --
    David Zolli

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut
    Merci beaucoup!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire dans une unité interdite en écriture
    Par colorid dans le forum EDI
    Réponses: 2
    Dernier message: 09/10/2012, 10h17
  2. Socket : lecture et écriture simultanée
    Par poukill dans le forum C++
    Réponses: 6
    Dernier message: 30/06/2010, 16h53
  3. Lecture et écriture sur une même socket ?
    Par nico_ayci dans le forum Réseau
    Réponses: 2
    Dernier message: 19/05/2008, 07h17
  4. [Perl] lecture/écriture simultanées sur une socket
    Par sephiburp dans le forum Programmation et administration système
    Réponses: 10
    Dernier message: 16/10/2007, 10h25
  5. JTextArea interdite en écriture.
    Par darkein dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/04/2006, 22h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo