ruby 套接字 : Error (EINVAL) while trying to bind a sending socket to a port

标签 ruby sockets tcp ip

当我尝试从 blue.example.edu 连接到 green.example 时,connect 方法无法给出 EINVAL .edu

当我从 blue 连接到 blue 本身时,我没有收到此错误。

ruby documentationconnect 下建议

Errno::EINVAL - the address length used for the sockaddr is not a valid length for the address family or there is an invalid family in sockaddr

但是当我尝试将 blue 连接到其自身的另一个端口时,由于相同的参数工作正常,这可能是错误的?

这是代码片段:

MY_NAME = Socket.gethostname
SERVER_NAME = "blue"    # Socket.gethostname returns 'blue' on the server
SERVER_IP = Socket::getaddrinfo(SERVER_NAME, 'www', nil, Socket::SOCK_STREAM)[0][3]  
#--> Gives me A.B.C.27 (see note on ipconfig below)

SERVER_LISTENING_PORT = 34900

MY_NAME = Socket.gethostname
MY_PORT_FOR_REQUESTING_SERVER = 40000

# other stuff

#CREATE
client_socket = Socket::new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
client_socket_addr = Socket.pack_sockaddr_in(MY_PORT_FOR_REQUESTING_SERVER, MY_NAME)

#BIND
client_socket.bind(client_socket_addr)

#CONNECT
server_addr = Socket.pack_sockaddr_in(SERVER_LISTENING_PORT, SERVER_NAME)
i_tried_with_ip_address_also = Socket.pack_sockaddr_in(SERVER_LISTENING_PORT, SERVER_IP)

#The line below raises the error
client_socket.connect(server_addr)

# more code below

请注意,在蓝色上点击 ifconfig 会产生与 SERVER_IP 包含的相同的 A.B.C.27

eth1 - inet addr:A.B.C.27, Bcast:A.B.C.255 Mask:255.255.255.0

我猜这与问题有关?

Ubuntu 机器上使用 Ruby 1.8.7

请指教。


编辑:

我按照 zed_0xff 的建议使用了 TCPSocket 以使其暂时工作。 但是我想知道为什么常规套接字方式不起作用。

我能看到的唯一区别是使用 Socket 类,我将 client_socket_addr 绑定(bind)到我希望发送数据的端口。 TCPSocket 从一个随机端口向服务器指定的监听端口发送数据。 如果我想将发送绑定(bind)到特定端口怎么办?


EDIT2:更改问题标题自:

Ruby 套接字:Errno::EINVAL:无效参数 - connect(2)

@zed_0xff 的回答帮助我解决了在客户端和服务器之间实际建立连接的问题之一(谢谢!)

但是,使用该方法,TCPSocket 会选择一个随机的发送端口来发送数据。尝试将发送端口绑定(bind)到特定端口号失败。


PS:如果修改问题名称违反社区准则,请告诉我。由于我的问题仅得到部分解决,因此我在此处自行编辑了标题,并在“编辑”部分解释了编辑内容。

最佳答案

bind() 获取 EINVAL 表明要绑定(bind)的地址可能仍在使用中。

为了解决这个问题

  • 要么使用不同的地址(IP 地址和/或端口)
  • 或者如果你想重用一个地址,在使用它之前在套接字上设置套接字选项SO_REUSEADDR
  • 或者不绑定(bind)...;-)

关于 ruby 套接字 : Error (EINVAL) while trying to bind a sending socket to a port,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832997/

相关文章:

java - 如何从 GPSD 检索数据并在 Android 客户端中使用它们

java - java中的最大套接字数

python - 通过 Pi 与 python 之间的套接字通信 (TCP/IP) 发送传感器数据

ruby-on-rails - 禁用卡住的字符串文字注释检查

android - Ruboto水平进度条?

ruby - bundler vs RVM vs gems vs RubyGems vs gemsets vs system ruby

python - 带有 Scapy 的不需要的 RST TCP 数据包

ruby-on-rails - RailsWizard 中排序算法的问题

c++ - 通过套接字发送西里尔文消息的问题

c# - 如何通过代码通过 tcp 绑定(bind)为 WCF 服务附加证书