On Sunday 16 January 2005 15:27, ts wrote: > >>>>> "B" == Bjarke Bruun <bbj / swooplinux.org> writes: > > B> I'm writing a small tcpserver and when I debug it and make changes > I B> have to stop the server and I get a hanging socket > > What class do you use for your server : TCPServer ? It's a small smtp server - just for fun... need to learn somethings about ruby and implementing rfc 821 seems well cool for starters :-) here is the core class (pre alpha everything you know :-)) I've tried the "kill -9" and it seems to work, but I would like it to be done in code not on the CLI. ---- # Author: Bjarke Bruun, bbj / swooplinux.org # Copyright: GPL version 2 require 'socket' require 'config' # Process the commandline parameters $cli = CliInfo.new # don't mind this - it's just for setting some variables on the CLI. class Server def initialize @data = nil @f = File.new("rsmtp.log","a") ss = TCPServer.new '0.0.0.0', 10000 server_going = true going = true while (@s = ss.accept) && server_going == true @f.puts("S: -> Client session established <-\n") fork { @s.print "220 Ruby SMTP Server/#{$cli.val("version")} \r\n" while going && @s.gets if $_ == "SERVER QUIT" # This is an attempt to send a "close" to the server so # it'll shut down proberly. server_going = false @s.close break end @f.puts("C: #{$_}") sleep 1 r = cmd($_) @s.print r @f.puts("S: #{r}") if r != nil if r =~ /^354(.*)/ r = getdata if r =~ /^354(.*)/ @s.print r @f.puts("DEBUG > #{r}") if r != nil end if r =~ /^221(.*)/ @f.puts("S: -> Quitting sesion successfully <- \n\n") @s.close going = false end end @s.close } end @s.close @f.close end def getdata #puts "DEBUG: Receiving data" @data = [] while @s.gets !~ /^\./ @data << $_ @f.puts("\t#{@data[-1]}") end "250 message accepted\r\n" end def cmd line case line when /^HELO \[\d*.\d*.\d*.\d*\]/ "250-#{$cli.val("SERVERNAME")} greets #{r}\r\n" when /^EHLO \[\d*.\d*.\d*.\d*\]/ remote = line.split(/.\[/) "250 #{$cli.val("SERVERNAME")} greets #{remote[1].split("\]")}"#250-8BITMIME\r\n250-SIZE\r\n250-DSN\r\n250 HELP" when /^MAIL FROM:(.*)/i @sndr = $1 "250 OK\r\n" #: Sender okay\r\n" when /^RCPT TO:(.*)/i @rcpt = $1 "250: Recipient okay\r\n" when /^DATA/i "354 Enter data, end with newline and '.'\r\n" when /^QUIT/i "221 closing connection\r\n" when /^RSET/i "250 okay\r\n" end end end # Run the server with logging enabled (it's a separate thread). server = Server.new -- Bjarke Bruun (Verify PGP-signature at hkp://pgp.mit.edu) Vegetarians eat Vegetables, Humanitarians frighten me.