1

から接続しようとすると、connectメソッドが失敗しますEINVALblue.example.edugreen.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:質問名の変更がコミュニティのガイドラインに違反しているかどうかを教えてください。私の問題は部分的にしか解決されなかったので、ここでタイトルを編集し、「編集」セクションで編集について説明しました。

4

3 に答える 3

2

取得EINVALするbind()ことは、バインドするアドレスがまだ使用されている可能性があることを示します。

これを回避するには

  • 別のアドレス(IPアドレスおよび/またはポート)を使用する
  • または、アドレスを再利用する場合は、SO_REUSEADDR使用する前にソケットにソケットオプションを設定します
  • またはバインドしないでください...;-)
于 2012-12-16T12:07:30.427 に答える