Ruby TCPServer 的 send 和 write 有什么区别?

yakczh · 2012年11月15日 · 最后由 yakczh 回复于 2012年11月15日 · 7162 次阅读

上代码 server

require "socket"    

server = TCPServer.new('127.0.0.1', 20000)    
print "Server started\n"  
loop do    
  Thread.start(server.accept) do |s|    
#  puts s.to_hash  
  print(s, " is accepted\n")    
  str="hello world"  
      begin   
         puts "sending ... " +str  
         s.send(str)  
    #s.write(str)  
         sleep 2  

      rescue Exception => e  
           print s  
          print(s, " is gone\n")    
          s.close    
      end   
    end   
end    

如果是 send 用任意客户端连接就会报错 :远程主机强迫关闭了一个现有的连接 但是用 write 就可以,这两个方法有什么区别吗?

send 后面可以加参数的样子

查了下文档, send(mesg, flags [, dest_sockaddr]) => numbytes_sent click to toggle source send mesg via basicsocket.

mesg should be a string.

flags should be a bitwise OR of Socket::MSG_* constants.

dest_sockaddr should be a packed sockaddr string or an addrinfo.

没说 flags 的具体参数代表什么 google 现在又搜不了 只要挨个试了下,send(msg,0) 这样可以发送 send(str,1) 这样也能发,但是少一个字符 2 以上客户端就报错

flags 的意思 man 一下就知道啦

man 2 send

No entry for send in section 2 of the manual

把程序上传到 linux 服务器上运行了一下,发现 flag=1 是一样的,flag=2 linux 一样正常发送,只有 win32 平台上才会断开连接

#4 楼 @yakczh er... 不是 mac 的话应该 man send 也有?

flag 0 1 2 win32 平台 正常发送接收 客户端断开 客户端断开
linux 平台 正常发送接收 客户端断开 正常发送接收

谁来在 mac 平台下测试一下, 我附上客户端代码

require 'socket'  
client = TCPSocket.new( "127.0.0.1", 20000 )  
 10.times {
  puts '-------------'
  puts   client.recv(10)
  sleep 2
 }
client.close 

更正一下,flag 为 1 的时候,客户端会少一个字符

需要 登录 后方可回复, 如果你还没有账号请 注册新账号