当我尝试连接时,该方法connect
失败EINVAL
blue.example.edu
green.example.edu
blue
当我连接到blue
自身时,我没有收到此错误。
建议下的 Ruby文档connect
Errno::EINVAL - 用于 sockaddr 的地址长度不是地址族的有效长度,或者 sockaddr 中的族无效
但是由于当我尝试将蓝色连接到其自身的另一个端口时,相同的参数工作正常,这可能是错误的?
这是代码片段:
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
蓝色会产生相同A.B.C.27
的SERVER_IP
内容
在下面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
到我希望从中发送数据的端口。TCPSocket 将数据从随机端口发送到服务器上指定的侦听端口。如果我希望将发送绑定到特定端口怎么办?
EDIT2:更改了问题标题:
Ruby 套接字:Errno::EINVAL:无效参数 - connect(2)
因此,@zed_0xff 的回答帮助我解决了在客户端和服务器之间实际建立连接的问题之一(谢谢!)
但是,使用该方法,TCPSocket 会选择一个随机发送端口来发送数据。尝试将发送端口绑定到特定端口号失败。
PS:如果修改问题名称违反社区准则,请告诉我。由于我的问题只是部分解决了,我在这里自己编辑了标题,并在“编辑”部分解释了编辑。