You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 438 Reporter: administrator Status: closed Resolution: fixed Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
Bug description
Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout', une erreur non rattrapée 'Sys_error("Bad file descriptor")'
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while. La communication
avec le client est du coup brutalement coupée.
Un exemple simple :
foo.ml:
let inet_addr = Unix.inet_addr_of_string "127.0.0.1"
let sock_addr = Unix.ADDR_INET (inet_addr, int_of_string Sys.argv.(1))
let f ic oc = output_string oc "foo"
let _ = Unix.establish_server f sock_addr
compilé par
ocamlc -o server unix.cma foo.ml
on lance le serveur :
./server 2002
un coup de telnet provoque l'erreur :
telnet localhost 2002
Bien sûr dans un programme simple comme
let oc = open_out
let _ = output_string oc "foo"
let _ = close_out oc
cette erreur ne survient pas lors du 'close_out'.
Maxence
The text was updated successfully, but these errors were encountered:
Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout',
Et qui laisse donc des donnees dans le buffer.
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while.
Normal, puisque le code de unix.ml essaye de fermer deux fois le socket:
] close_in inchan;
] close_out outchan;
Et en plus, dans le mauvais ordre, c'est-a-dire que le socket est ferme
avant qu'on essaye d'ecrire les donnes du buffer de sortie.
C'est fixe dans la version de travail, ainsi que le bug qui consiste a
ne pas faire "exit" dans le fils quand il a fini de travailler...
Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout', une erreur non rattrapée 'Sys_error("Bad file descriptor")'
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while. La communication
avec le client est du coup brutalement coupée.
En effet, c'est un bug dans establish_server: il faut faire close_out
avant close_in, car les deux canaux font référence au même descripteur
de fichier, et close_out a besoin que le descripteur soit encore
ouvert pour faire flush, alors que close_in s'en fiche.
Original bug ID: 438
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout', une erreur non rattrapée 'Sys_error("Bad file descriptor")'
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while. La communication
avec le client est du coup brutalement coupée.
Un exemple simple :
foo.ml:
let inet_addr = Unix.inet_addr_of_string "127.0.0.1"
let sock_addr = Unix.ADDR_INET (inet_addr, int_of_string Sys.argv.(1))
let f ic oc = output_string oc "foo"
let _ = Unix.establish_server f sock_addr
compilé par
ocamlc -o server unix.cma foo.ml
on lance le serveur :
./server 2002
un coup de telnet provoque l'erreur :
telnet localhost 2002
Bien sûr dans un programme simple comme
let oc = open_out
let _ = output_string oc "foo"
let _ = close_out oc
cette erreur ne survient pas lors du 'close_out'.
The text was updated successfully, but these errors were encountered: