2

Winsock2ソケットをブロッキングから非ブロッキングに変更したい。そして、これはws2_32.dllライブラリの「ioctlsocket」関数を呼び出すことで実現できることを私は知っています。しかし、私の実装は、ソケットエラーを示す-1の戻り値でその目的を果たすことができません。WSAGetLastErrorを呼び出してエラーコードを取得しようとしましたが、10014が返されます。これは、無効なポインタと関係があると思います。この場合、私のせいは何でしょうか?誤って宣言したり、API関数に値を渡したりしているのではないかと思いますが、その理由がわかりませんでした。または、誰かがソケットを非ブロッキングにする別の方法を提案できますか?

(何らかの理由で、Rubyのソケットクラスを使用できません。)

これが私のコードです(@fdは私のソケットへの記述子です):

proc = Win32API.new( "ws2_32"、 "ioctlsocket"、 "plp"、 "l")ret = proc.call(@fd、0x8004667E、1)#FIONBIO p ret => -1

4

2 に答える 2

1

最後の引数を配列に「パック」する必要があることがわかりました。これはCスタイルの構造体にのみ当てはまると思いましたが、どういうわけかうまくいきました。これで、ソケットは正常にノンブロッキングモードになります。

動作するコードは次のようになります。

proc.call(@ fd、0x8004667E、[1] .pack( "l"))#FIONBIO

しかし、誰もこれを必要としないと思います。Ruby独自のソケット実装は強力ですが、自分でソケットラッパーを作成するよりもはるかに簡単です。

于 2013-02-21T04:43:29.843 に答える
1

最後のパラメータはあなたをクラッシュさせています:

proc = Win32API.new("ws2_32", "ioctlsocket", "plp", "l") ret = proc.call(@fd, 0x8004667E, 1) # FIONBIO p ret => -1

ioctlsocket()の最後のパラメーターは、longではなくlongへのポインターです( 10014戻りコードはWSAEFAULTです。これは、基本的に、そのパラメーターを逆参照しようとしてクラッシュしたことを意味します)。代わりに、longを渡すためのポインターを形成する方法を説明するのに十分なRubyを知りませんが、うまくいけば、これで十分です。

于 2013-02-18T18:30:22.243 に答える