gpt4 book ai didi

ruby-on-rails - 如何告诉服务器EOF是否为ruby套接字

转载 作者:行者123 更新时间:2023-12-03 11:59:55 44 4
gpt4 key购买 nike

server.rb

require 'socket'
Socket.tcp_server_loop(6666) do |connection|
while data = connection.read(1024 * 16) do
if data == 'hello'
connection.write('hi hi hi hi hi')
end
end
connection.close
end

client.rb
需要“ socket ”
需要'io/console'
client = TCPSocket.new('localhost', 6666)
client.write('hello')
client.flush
# client.close_write
# client.close_write
# client.fdatasync
# client.fsync

data = client.read
puts data

# client.open
# client.write('hello')
# puts client.read

我想重新使用 socks ,所以我不想关闭它。

但是,如果我不发送client.close_write,它将无法正常工作,无法读取服务器数据。
如果client.close_write套接字已关闭,它将不再将数据写入服务器。

我想知道如何告诉EOF并且不关闭 socket ?
fdatasync中的client.fdatasync =>:不支持操作(Errno::ENOTSUP)

fsync中的client.fsync =>:不支持操作(Errno::ENOTSUP)

我认为fdatasync和fsync也许是告诉EOF的方法,但它们不起作用。

C语言有一种方法可以做到这一点:
ssize_t send(int sockfd,const void * buff,size_t nbytes,int flags)
nbytes指示服务器数据大小。在ruby中没有这样的方法。

最佳答案

c language has a method to do that: ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags) the nbytes tell the server data size.



C没有做到这一点的方法。 nbytes中的 send告诉 send发送多少 buff,并且不将EOF传送到另一端。 Ruby是等效的:套接字在关闭时没有EOF。 EOF是一种条件(流已到达末尾的标志);它通常不以可传输的形式存在。

或者,您可以发送内容的大小:这是HTTP中 Content-Length header 的目的。当正文开始后,Web服务器收到 Content-Length字节时,Web服务器认为请求已完成。如果服务器还在响应中发送 Content-Length,则客户端将知道服务器何时完成而服务器不会断开连接,并且可以重用该连接。表示结束的另一种方法是具有一个明确表示结束的信号。您可以使用EOT字符(0x04),只要您不传输任何自然包含它的内容即可(通常,文本可以,而不是二进制数据)。如果您正在传输可能包含EOT的数据,则可以对其进行编码,以使其变为不可能(例如使用Base64)。

关于ruby-on-rails - 如何告诉服务器EOF是否为ruby套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933295/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com