から接続しようとすると、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マシンでのRuby1.8.7の使用
ご意見をお聞かせください。
編集:
これを一時的に機能させるために、zed_0xffによって提案されたTCPSocketを使用しました。ただし、通常のソケットウェイが機能しない理由を知りたいです。
私が見ることができる唯一の違いは、Socketクラスを使用してclient_socket_addr
、データの送信元のポートにをバインドしていることです。TCPSocketは、ランダムポートからサーバー上の指定されたリスニングポートにデータを送信します。送信を特定のポートにバインドしたい場合はどうすればよいですか?
EDIT2:質問のタイトルを次のように変更しました:
Rubyソケット:Errno :: EINVAL:引数が無効です-connect(2)
したがって、@ zed_0xffからの回答は、クライアントとサーバー間の接続を実際に確立するという私の問題の1つに取り組むのに役立ちました(ありがとうございます!)
ただし、その方法では、TCPSocketはデータを送信するためにランダムな送信ポートを選択します。送信ポートを特定のポート番号にバインドしようとすると失敗します。
PS:質問名の変更がコミュニティのガイドラインに違反しているかどうかを教えてください。私の問題は部分的にしか解決されなかったので、ここでタイトルを編集し、「編集」セクションで編集について説明しました。